Skip to content

Commit

Permalink
M4l3 testing (#16)
Browse files Browse the repository at this point in the history
* M4l3 testing

* M4l3 testing
  • Loading branch information
svok authored Jul 31, 2024
1 parent 2c8c978 commit 197130b
Show file tree
Hide file tree
Showing 93 changed files with 2,821 additions and 181 deletions.
283 changes: 113 additions & 170 deletions docs/05-testing/01-tests-list.md

Large diffs are not rendered by default.

28 changes: 28 additions & 0 deletions docs/05-testing/test-01.01.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
### Карточка тестового случая

**Название:** Проверка корректного отображения формы регистрации

**Описание:**
Этот тестовый случай проверяет, что форма регистрации отображается на платформе корректно и все ее элементы доступны для
ввода данных.

**Предусловия:**

1. Доступ к интернету.
2. Пользователь находится на странице регистрации платформы.

**Шаги:**

1. Открыть веб-браузер и перейти на страницу регистрации платформы.
2. Проверить, что форма регистрации отображается на экране.
3. Убедиться, что все необходимые поля для ввода данных присутствуют на форме (например, поле для ввода электронной
почты, пароля, имени и т. д.).
4. Проверить, что форма содержит кнопку "Зарегистрироваться" или аналогичную, предназначенную для отправки данных.
5. Проверить визуальное оформление формы: соответствие цветовой схеме платформы, четкость текста, отступы и т. д.
6. Попробовать ввести тестовые данные в поля формы и убедиться, что они корректно отображаются.

**Ожидаемый результат:**
Форма регистрации отображается корректно, все необходимые поля присутствуют и доступны для ввода данных, визуальное
оформление соответствует стандартам дизайна платформы.

**Тип теста:** Функциональный тест, UI/UX тест
25 changes: 25 additions & 0 deletions docs/05-testing/test-01.02.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
### Карточка тестового случая

**Название:** Ввод корректных данных и нажатие кнопки "Зарегистрироваться"

**Описание:**
Этот тестовый случай проверяет корректность процесса регистрации на платформе после ввода корректных данных в форму
регистрации.

**Предусловия:**

1. Доступ к интернету.
2. Пользователь находится на странице регистрации платформы.

**Шаги:**

1. Открыть веб-браузер и перейти на страницу регистрации платформы.
2. Убедиться, что форма регистрации отображается на экране.
3. Ввести корректные данные в поля формы (например, действительный адрес электронной почты, пароль, имя и т. д.).
4. Нажать кнопку "Зарегистрироваться" или аналогичную, предназначенную для отправки данных.
5. Дождаться ответа от сервера.

**Ожидаемый результат:**
Пользователь успешно зарегистрирован на платформе после ввода корректных данных и нажатия кнопки "Зарегистрироваться".

**Тип теста:** Функциональный тест
24 changes: 24 additions & 0 deletions docs/05-testing/test-02.01.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
### Карточка тестового случая

**Название:** Проверка возможности создания нового объявления о компоненте

**Описание:**
Этот тестовый случай проверяет функциональность создания нового объявления о компоненте на платформе.

**Предусловия:**

1. Доступ к интернету.
2. Пользователь авторизован на платформе и находится на странице управления объявлениями.

**Шаги:**

1. Открыть веб-браузер и перейти на страницу управления объявлениями на платформе.
2. Нажать кнопку "Создать новое объявление" или аналогичную.
3. Заполнить все обязательные поля для нового объявления (например, заголовок, описание, цена, изображения и т. д.).
4. Нажать кнопку "Сохранить" или аналогичную для создания объявления.
5. Проверить, что объявление успешно создано и отображается на платформе.

**Ожидаемый результат:**
Новое объявление о компоненте успешно создано и отображается на платформе, все введенные данные корректно отображаются.

**Тип теста:** Функциональный тест
53 changes: 43 additions & 10 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,61 @@ kotlin = "2.0.0"

kotlinx-datetime = "0.5.0"
kotlinx-serialization = "1.6.3"
coroutines = "1.8.0"

binaryCompabilityValidator = "0.13.2"

openapi-generator = "7.3.0"
jackson = "2.16.1"

logback = "1.5.3"
kotest = "5.8.0"
kermit = "2.0.3"

#Frameworks
ktor = "2.3.9"

#Testing
testcontainers = "1.19.7"

# BASE
jvm-compiler = "17"
jvm-language = "21"

[libraries]
plugin-kotlin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
plugin-binaryCompatibilityValidator = { module = "org.jetbrains.kotlinx:binary-compatibility-validator", version.ref = "binaryCompabilityValidator" }
kotlinx-datetime = {module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime"}
kotlinx-serialization-core = {module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinx-serialization"}
kotlinx-serialization-json = {module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization"}
kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" }
kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinx-serialization" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" }
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }

jackson-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson" }
jackson-datatype = { module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", version.ref = "jackson" }

# Logging
logback = { module = "ch.qos.logback:logback-classic", version.ref = "logback" }
kermit = { module = "co.touchlab:kermit", version.ref = "kermit" }

# Ktor
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-client-okhttp = { module = "io.ktor:ktor-client-okhttp", version.ref = "ktor" }

# Testing
kotest-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" }
kotest-core = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" }
kotest-datatest = { module = "io.kotest:kotest-framework-datatest", version.ref = "kotest" }
kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" }

testcontainers-core = { module = "org.testcontainers:testcontainers", version.ref = "testcontainers" }

jackson-kotlin = {module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson"}
jackson-datatype = {module = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", version.ref = "jackson"}
[bundles]
kotest = ["kotest-junit5", "kotest-core", "kotest-datatest", "kotest-property"]

[plugins]
kotlin-multiplatform = {id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin"}
kotlin-jvm = {id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin"}
openapi-generator = {id = "org.openapi.generator", version.ref = "openapi-generator"}
crowdproj-generator = {id = "com.crowdproj.generator", version = "0.2.0"}
kotlinx-serialization = {id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin"}
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
openapi-generator = { id = "org.openapi.generator", version.ref = "openapi-generator" }
crowdproj-generator = { id = "com.crowdproj.generator", version = "0.2.0" }
kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
2 changes: 2 additions & 0 deletions lessons/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ kotlin.native.ignoreDisabledTargets=true
kotlinVersion=2.0.0
coroutinesVersion=1.8.1
datetimeVersion=0.6.0
jUnitJupiterVersion=5.10.2
kotestVersion=5.9.1
73 changes: 73 additions & 0 deletions lessons/m4l3-testing/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent

plugins {
kotlin("multiplatform")
id("io.kotest.multiplatform")
}

kotlin {
jvm()
linuxX64()

val kotestVersion: String by project
val coroutinesVersion: String by project
val datetimeVersion: String by project
val jUnitJupiterVersion: String by project

sourceSets {
commonMain {
dependencies {
implementation(kotlin("stdlib-common"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
}
}
commonTest {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion")

implementation("io.kotest:kotest-framework-engine:$kotestVersion")
implementation("io.kotest:kotest-framework-datatest:$kotestVersion")
implementation("io.kotest:kotest-assertions-core:$kotestVersion")
implementation("io.kotest:kotest-property:$kotestVersion")
}
}
jvmMain {
dependencies {
implementation(kotlin("stdlib"))
}
}
jvmTest {
dependencies {
implementation(kotlin("test-junit5"))
implementation("io.kotest:kotest-runner-junit5-jvm:$kotestVersion")
implementation("org.junit.jupiter:junit-jupiter-params:$jUnitJupiterVersion")
}
}
nativeMain {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-datetime:$datetimeVersion")
}
}
}
}

tasks {
withType<Test>().configureEach {
useJUnitPlatform {
// includeTags.add("sampling")
}
filter {
isFailOnNoMatchingTests = false
}
testLogging {
showExceptions = true
showStandardStreams = true
events = setOf(TestLogEvent.FAILED, TestLogEvent.PASSED)
exceptionFormat = TestExceptionFormat.FULL
}
}
}
6 changes: 6 additions & 0 deletions lessons/m4l3-testing/src/commonMain/kotlin/DateString.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
data class DateString(
val iso: String
)

//for ex 2022-04-16T07:50:06.696578
expect fun currentDate(): DateString
30 changes: 30 additions & 0 deletions lessons/m4l3-testing/src/commonTest/kotlin/CommonTestCase.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.string.shouldContainOnlyDigits

class UUIDTestCommon : FunSpec() {
init {
test("date should starts with year") {
println(currentDate().iso)
currentDate().iso
.take(4)
.shouldContainOnlyDigits()
}

test("date should contains separator") {
currentDate().iso shouldContain "T"
}

test("date should contains date and time") {
val data = currentDate().iso
.split("T")

//simple checs
data.size shouldBe 2

data.first().filter { it == '-' }.length shouldBe 2
data.last().filter { it == ':' } shouldBe "::"
}
}
}
25 changes: 25 additions & 0 deletions lessons/m4l3-testing/src/commonTest/kotlin/KTestTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import kotlin.test.*

class KTestTest {

@Test
fun kTest() {
assertEquals(4, 2 * 2)
}

@Ignore
@Test
fun ignoredTest() {
println("I will never be invoked")
}

@BeforeTest
fun beforeTest() {
println("Before Test")
}

@AfterTest
fun afterTest() {
println("After Test")
}
}
23 changes: 23 additions & 0 deletions lessons/m4l3-testing/src/commonTest/kotlin/KotestWithBDD.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.shouldBe

class KotestWithBDD() : BehaviorSpec({
Given("State A") {
val state = "State A"
println("state A ")
When("Action A") {
val condition = 2
println("in action A")
Then("State => A1") {
println("becomes A1")
condition shouldBe 2
}
}
When("Action B") {
println("in action B")
Then("State => B1") {
println("becomes B1")
}
}
}
})
47 changes: 47 additions & 0 deletions lessons/m4l3-testing/src/commonTest/kotlin/KotestWithParams.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import io.kotest.assertions.assertSoftly
import io.kotest.common.ExperimentalKotest
import io.kotest.common.Platform
import io.kotest.common.platform
import io.kotest.core.spec.style.DescribeSpec
import io.kotest.core.spec.style.ShouldSpec
import io.kotest.core.spec.style.describeSpec
import io.kotest.data.forAll
import io.kotest.data.row
import io.kotest.datatest.withData
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldMatch

class KotestWithParams : ShouldSpec({
withData(
mapOf(
"10x2" to Triple(10, 2, 20),
"20x2" to Triple(20, 2, 40),
"30x2" to Triple(30, 2, 60),
)
) { (a, b, c) ->
a * b shouldBe c
}
})

@OptIn(ExperimentalKotest::class)
class EmailTest : DescribeSpec({
include(emailValidation)
})

@ExperimentalKotest
val emailValidation = describeSpec {

// describe("Registration").config(enabled = platform != Platform.JS) {
describe("Registration").config(enabled = platform != Platform.JS) {
context("Checking user's mail") {
forAll(
row("[email protected]"),
row("[email protected]"),
) {
assertSoftly {
it shouldMatch "^(.+)@(.+)\$"
}
}
}
}
}
21 changes: 21 additions & 0 deletions lessons/m4l3-testing/src/jvmMain/kotlin/Message.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
fun getMessage(): String {
return "Hello, my friend!"
}

fun getMessage(name: String): String {
return if (name.uppercase() == name) {
"HELLO $name!"
} else {
"Hello $name!"
}
}

fun getMessage(vararg name: String): String {
return if (name.find { it.uppercase() == it } != null) {
getMessage(name.joinToString(", ") {
it.uppercase()
})
} else {
getMessage(name.joinToString(", "))
}
}
6 changes: 6 additions & 0 deletions lessons/m4l3-testing/src/jvmMain/kotlin/currentDate.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

actual fun currentDate(): DateString {
return DateString(LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME))
}
Loading

0 comments on commit 197130b

Please sign in to comment.