Skip to content

Commit

Permalink
M4l4 testing (#17)
Browse files Browse the repository at this point in the history
* M4l4 testing
  • Loading branch information
svok authored May 8, 2024
1 parent 3b9d691 commit cbcf3d2
Show file tree
Hide file tree
Showing 93 changed files with 2,819 additions and 172 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. Проверить, что объявление успешно создано и отображается на платформе.

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

**Тип теста:** Функциональный тест
35 changes: 34 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,58 @@ kotlin = "1.9.23"

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" }
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" }

[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" }
Expand Down
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=1.9.22
coroutinesVersion=1.7.3
datetimeVersion=0.5.0
jUnitJupiterVersion=5.10.2
kotestVersion=5.6.1
84 changes: 84 additions & 0 deletions lessons/m4l4-testing/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
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 {}
js {
browser {
// testTask {
// useMocha()
// }
}
binaries.executable()
}

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

sourceSets {
val commonMain by getting {
dependencies {
implementation(kotlin("stdlib-common"))
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
}
}
val commonTest by getting {
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")
}
}
// val jsMain by getting {
// dependencies {
// implementation(kotlin("stdlib-js"))
// }
// }
val jsTest by getting {
dependencies {
implementation(kotlin("test-js"))
}
}
val jvmMain by getting {
dependencies {
implementation(kotlin("stdlib"))
}
}
val jvmTest by getting {
dependencies {
implementation(kotlin("test-junit5"))
implementation("io.kotest:kotest-runner-junit5-jvm:$kotestVersion")
implementation("org.junit.jupiter:junit-jupiter-params:$jUnitJupiterVersion")
}
}
}
}

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/m4l4-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/m4l4-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/m4l4-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")
}
}
19 changes: 19 additions & 0 deletions lessons/m4l4-testing/src/commonTest/kotlin/KotestWithBDD.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import io.kotest.core.spec.style.BehaviorSpec

class KotestWithBDD() : BehaviorSpec({
Given("State A") {
println("state A ")
When("Action A") {
println("in action A")
Then("State => A1") {
println("becomes A1")
}
}
When("Action B") {
println("in action B")
Then("State => B1") {
println("becomes B1")
}
}
}
})
47 changes: 47 additions & 0 deletions lessons/m4l4-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 "^(.+)@(.+)\$"
}
}
}
}
}
5 changes: 5 additions & 0 deletions lessons/m4l4-testing/src/jsMain/kotlin/currentDate.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import kotlin.js.Date

actual fun currentDate(): DateString {
return DateString(Date().toISOString())
}
28 changes: 28 additions & 0 deletions lessons/m4l4-testing/src/jsTest/kotlin/KotestTestJs.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.string.shouldContainOnlyDigits

class UUIDTestJS : StringSpec({
"date should starts with year" {
println(currentDate().iso) // sample for sout in js
currentDate().iso
.take(4)
.shouldContainOnlyDigits()
}

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

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

//simple checks
data.size shouldBe 2

data.first().filter { it == '-' }.length shouldBe 2
data.last().filter { it == ':' } shouldBe "::"
}
})
Loading

0 comments on commit cbcf3d2

Please sign in to comment.