2017-09-12 2 views
1

Chaque fois qu'une fonction de test (une fonction annotée avec test) contient des assertions qui échouent, l'assertion a le même effet que lorsqu'une exception est tracée: aucune ligne de code supplémentaire dans cette fonction ne sera exécutée . Ainsi, assert les instructions dans les fonctions qui sont annotées avec 'test' fonctionne exactement comme les instructions assert ordinaires dans les fonctions Ceylan ordinaires. Ce runs contrary to the documentation, qui stipule que les déclarations assert ordinaires peuvent être utilisées pour faire des tests unitaires.ceylon.test.TestRunner échoue lorsque les tests échouent

Ainsi, l'exécution du code ci-dessous, je peux voir la déclaration myTests1 mais pas'myTests2`:

import ceylon.test { 
    test, TestRunner, createTestRunner 
} 

test 
Anything myTests1() { 
    // assert something true! 
    assert(40 + 2 == 42); 
    print("myTests1"); 
    return null; 
} 

test 
void myTests2() { 
    // assert something false! 
    assert(2 + 2 == 54); 
    print("myTests2"); 
} 


"Run the module `tests`." 
shared void run() { 

    print("reached run function"); 

    TestRunner myTestRunner = createTestRunner(
     [`function myTests1`, `function myTests2`]); 

    myTestRunner.run(); 
} 

Ceci est la sortie réelle:

"C:\Program Files\Java\jdk1.8.0_121\bin\java" -Dceylon.system.repo=C:\Users\Jon\.IdeaIC2017.2\config\plugins\CeylonIDEA\classes\embeddedDist\repo "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.1\lib\idea_rt.jar=56393:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.1\bin" -Dfile.encoding=windows-1252 -classpath C:\Users\Jon\.IdeaIC2017.2\config\plugins\CeylonIDEA\classes\embeddedDist\lib\ceylon-bootstrap.jar com.redhat.ceylon.launcher.Bootstrap run --run run tests/1.0.0 
reached run function 
myTests1 

Process finished with exit code 0 

Répondre

4

Cela fonctionne comme prévu - le remplacement de assert s par assertEquals 'a le même effet et affiche la même sortie, car les deux font exactement la même chose: lancer une exception si l'assertion échoue.

Tous les cadres de test que je connais se comportent de la même manière dans cette situation: un échec d'assertion entraîne une exception et met immédiatement fin à l'exécution de la méthode de test. C'est par conception, puisque vous ne savez pas ce que votre programme fera une fois qu'une attente sera violée - le reste de la méthode pourrait dépendre de cette affirmation en restant vrai, et pourrait se briser de manière imprévisible et déroutante.

Si vous des tests d'écriture comme

test 
shared void testTwoThings() { 
    assertEquals { expected = 42; actual = 40 + 2; }; 
    assertEquals { expected = 42; actual = 6 * 9; }; 
} 

vous êtes censé écrire deux tests à la place.

+0

Merci :) Les fonctions annotées de 'test' sont donc 'l'unité minimale' des tests unitaires. Et pour regrouper plusieurs tests unitaires dans un groupe soigné, je devrais utiliser par exemple. Des classes. – loldrup

+1

Oui, ou des objets de niveau supérieur. Il est également possible d'hériter des méthodes de test - par exemple, une superclasse abstraite peut déclarer des valeurs 'formel' et définir une fonction de test qui utilise ces valeurs, et les objets de haut niveau dérivant peuvent définir ces valeurs et hériter de la fonction de test. –