Em um dos projetos antigos, as declaraçÔes de JUnit, kotlin.test e AssertJ foram empilhadas. Esse nĂŁo era seu Ășnico problema: geralmente era escrito como uma carta do tio Fyodor, e nĂŁo havia tempo para parar e trazĂȘ-la para uma Ășnica forma. E agora chegou a hora.
O artigo conterĂĄ uma minipesquisa sobre quais afirmaçÔes sĂŁo melhores de acordo com critĂ©rios subjetivos. No começo, eu queria fazer algo simples: realizar um conjunto de testes para rebitar rapidamente as opçÔes com copiar e colar. Em seguida, ele destacou os dados gerais do teste, automatizou algumas das verificaçÔes e como tudo correu ... O resultado foi uma pequena pedra de Rosetta, e este artigo pode ser Ăștil para vocĂȘ escolher uma biblioteca de afirmaçÔes que se adapte Ă s suas realidades.
Farei uma reserva imediata de que o artigo não compararå estruturas de teste, abordagens de teste e algumas abordagens complicadas para validação de dados. Vamos falar sobre afirmaçÔes simples.

Se vocĂȘ estĂĄ com preguiça de ler o raciocĂnio chato, a histĂłria de minhas provaçÔes e outros detalhes, pode ir diretamente aos resultados da comparação .
Um pouco de fundo
Scala, â ScalaTest. , - , - .
Kotlin, - , , Kotest ( , ).
, , â . :
- Kotlin IntelliJ Idea. Scala- â . , ScalaTest , . IntelliJ
<Click to see difference>, . , , IntelliJ Idea â Kotlin- - , ?

- .
1 != 2, , "expected" "actual". " 100 , , ", , "⊠, , , ". , ? , â , , - . - .
assertEquals(expected, actual)â , . , â /, " , , " ,contains,includes. â , . - . -
assertThat("Friendship").contains("end"). - . - JUnit4, ,
ExpectedException@Rule. - () .
- .
- . â , . , : , , generic-, . -:
assertThat(generic<Boolean>(input)).isEqualTo(true).<Boolean>. . - , . . ? â , , . - , equals. - .
, , , , , . , â , . , -, QA-.
, 5 , , â .
:
- ScalaTest â .
- JUnit 5 â Java-.
- kotlin.test â multiplatform . â JUnit, .
- AssertJ â . FestAssert, - .
- Kotest â KotlinTest, kotlin.test. , ScalaTest. 1-22 â scala.
- Truth â . , AssertJ.
- Hamrest Ââ . valid4j.
- Strikt â AssertJ .
- Kluent â , JUnit ( â kotlin.test), Kotest. â , .
- Atrium â , AssertJ, . â ( maven/gradle).
- Expekt â Chai.js. : â 4 .
- AssertK â AssertJ, AssertK ( ).
- HamKrest â Hamrest, HamKrest ( Hamcrest ).
â , -.
, , 1 â 1 . , , - , " , " "".
, - , JUnit , , , , , . ScalaTest, : , , â . : ? , :). / , , .
: listOf(1,2,3)? â -, â . , , : , . , .
type erasure. Reified inline-, .
assertThrows<T>{...}
, reified :
assertThrows(expectedClass){...}
. , kotlin.test Asserter: , . , ?:)
GitHub. ScalaTest , .
: 0 â , 0.5 â , 1 â . â 9 .
-, , . . , . , - , " " , " " . .
| Kotest | ± | ± | + | + | + | + | + | - | 6.0 | |
| Kluent | ± | ± | + | + | + | + | + | - | 6.0 | |
| AssertJ | ± | + | ± | + | ± | + | + | ± | 6.0 | |
| Truth | ± | + | + | + | - | + | + | - | 5.5 | |
| Strikt | ± | ± | ± | + | + | + | + | - | 5.5 | |
| ScalaTest | ± | ± | ± | + | + | + | + | - | 5.5 | |
| HamKrest | ± | - | ± | + | + | ± | + | - | 5.5 | |
| AssertK | ± | ± | ± | + | ± | + | + | - | 5.0 | |
| Atrium | ± | ± | ± | + | + | ± | + | - | 5.0 | |
| Hamrest | ± | ± | ± | + | - | ± | + | - | 5.0 | |
| JUnit | + | + | - | ± | + | - | ± | - | 4.5 | |
| kotlin.test | + | ± | - | - | + | - | - | - | 3.5 | |
| Expekt | ± | ± | - | + | - | ± | + | - | 3.5 |
:
- Para conectar apenas declaraçÔes, vocĂȘ precisa ir mais fundo. Na minha opiniĂŁo, Ă© difĂcil entender isso imediatamente.
- Ele nĂŁo tem a opção de capturar uma exceção com um parĂąmetro explĂcito, e nĂŁo reificado, mas isso na verdade nĂŁo Ă© realmente necessĂĄrio: muito poucas pessoas lidam com essas perversĂ”es.
- Estruturas complexas: teste com matrizes aninhadas falhou. Abri um ingresso para isso .
- :
<Click to see difference>. - : .
- : , .
-
"hello".shouldBeEqualTo("hello"),"hello" `should be equal to` "hello". DSL . - :
invoking { block() } shouldThrow expectedClass.kotlin withMessage expectedMessage - , , .
Expected Iterable to contain none of "[1, 3]"â , Iterable . - :
<Click to see difference>. - : .
â ⊠,
containsExactly, âhasSameElementsAs, â.usingRecursiveComparison().isEqualTo.
:
<Click to see difference>.
: - , . , , .
:
.usingRecursiveComparison(), . : , , . , , ,
assertThat(actual) .usingRecursiveComparison() .isNotEqualTo(unexpected)
: .
: . , DSL.
- , .
- : , ,
assertThrowsJUnit5. , JUnit , ? - : , , :
containsAtLeastElementsIn. ,assertThat(actual).isEqualTo(expected). - :
<Click to see difference>. - : .
- : , .
- " ":
expected: 1 but was : 2 at asserts.truth.TruthAsserts.simpleAssert(TruthAsserts.kt:10) at common.FailedAssertsTestBase.simple assert should have descriptive message(FailedAssertsTestBase.kt:20) at [[Reflective call: 4 frames collapsed (https://goo.gl/aH3UyP)]].(:0) at [[Testing framework: 27 frames collapsed (https://goo.gl/aH3UyP)]].(:0) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at [[Testing framework: 9 frames collapsed (https://goo.gl/aH3UyP)]].(:0) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at [[Testing framework: 9 frames collapsed (https://goo.gl/aH3UyP)]].(:0) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at [[Testing framework: 17 frames collapsed (https://goo.gl/aH3UyP)]].(:0) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99) ...
, reified, : .
:
expectThat(haystack).not().contains(needle),expectThat(collection).doesNotContain(items).
:
contentEquals. :expectThat(actual).not().contentEquals(unexpected). , ,Array<T>Strikt - . âcontainsExactly, âcontainsExactlyInAnyOrder.
: . , . :
val actual: Array<String> = arrayOf("1") val expected: Array<String> = arrayOf("2") expectThat(actual).contentEquals(expected)
,
contentEquals. ,contentEquals:
infix fun <T> Assertion.Builder<Array<out T>>.contentEquals(other: Array<out T>)
-
val actual: Array<out String> = arrayOf("1") val expected: Array<String> = arrayOf("2") expectThat(actual).contentEquals(expected)
:
<Click to see difference>.
: , .
: .
- , , . â , .
- , Hamcrest, - : -.
- â :
assertThat( { block() }, throws(has(RuntimeException::message, equalTo(expectedMessage)))) - : . - 3,5 . :
assertThat(collection, allOf(items.map { hasElement(it) })). - .
- : .
- :
<Click to see difference>. - â - :
expected: a value that not contains 1 or contains 3 but contains 1 or contains 3
â AssertJ. ( , -).
: AssertJ
assertThat(collection).containsAll(items), AssertK ,containsAllvararg. ,containsAll(1,2,3), . , , â . â . ,containsOnlycontainsExactly.
:
<Click to see difference>.
: - , , .
:
.usingRecursiveComparison().
â ( ), :
expected to contain exactly:<[3, 4, 5]> but was:<[1, 2, 3]> at index:0 unexpected:<1> at index:1 unexpected:<2> at index:1 expected:<4> at index:2 expected:<5>
?
: .
- : fluent infix.
assertThat(x).isEqualTo(y)x shouldBe y, ,expect(x).toBe(y)expect(x) toBe y. , , "". -o:expect(x) contains o atLeast 1 butAtMost 2 value "hello". , , . infix- ( - ), Atrium fluent-. - : :
notToBe,containsNot. . , :containsvararg,containsElementsOf, . ,contains(1,2,3), .expect(collection).containsNot.elementsOf(items). - ,
toList. - , reified, : .
- : .
- :
<Click to see difference>. - : ( , ), :
expected that subject: [4, 2, 1] (java.util.Arrays.ArrayList <938196491>) ââdoes not contain: ⏠an entry which is: 1 (kotlin.Int <211381230>) ââânumber of such entries: 1 âis: 0 (kotlin.Int <1934798916>) ââhas at least one element: true âis: true - : .
: (
assertThat(actual, `is`(not(unexpected)))
assertThat(actual, not(unexpected))
containsStringvscontainsvshasItemvshasItems. , :hasItemsvararg,Set<T>T. ,hasItems(1,2,3), .
assertThat(collection, allOf(items.map { hasItem(it) }))
:
assertThat(collection, not(anyOf(items.map { hasItem(it) })))
hasItems, ± "", , .
: .
:
<Click to see difference>.
: .
: .
- : -
assertEquals(expected, actual), :assertArrayEquals,assertIterableEquals.. - : , JUnit - , .
- :
assertLinesMatch(listOf(".*$needle.*"), listOf(haystack)), . - :
assertLinesMatch, ,assertIterableEquals. - : ,
assertIterableEqualsMapSet, . - : .
- . JUnit, . , .
- , JUnit, :
- .
-
assertIterableEquals, . - : JUnit'
assertEquals, kotlin.test , . - : .
Kotest, Kluent AssertJ. , Kotlin , AssertJ ( ). , .
â , , AssertJ. , , .