2017-09-12 261 views
1

無論何時測試函數(包含test註解的函數)包含失敗的斷言,斷言與拋出異常時的效果相同:將不會執行該函數中的其他代碼行。因此,在用'test'註釋的函數中斷言語句就像普通的Ceylon函數中的普通斷言語句一樣工作。這runs contrary to the documentation,它聲明普通的斷言語句可以用於進行單元測試。ceylon.test.TestRunner在測試失敗時失敗

因此,運行下面的代碼,我能看到的聲明myTests1但不'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(); 
} 

這是實際的輸出:

"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 

回答

4

這是如預期運行 - 用assertEquals代替那些assert'具有相同的效果並且輸出相同的輸出,因爲兩者完全相同:如果斷言失敗則拋出異常。

我知道所有測試框架在這種情況下的行爲方式都是一樣的:斷言失敗導致異常,因此立即終止測試方法的執行。這是設計的,因爲一旦一個期望被違反,你就不知道你的程序會做什麼 - 該方法的其餘部分可能依賴於該斷言保持真實,並且可能以不可預知和混亂的方式破壞。

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

如果你正在編寫測試你應該寫兩個測試來代替。

+0

謝謝:) 所以'測試'註釋函數是單元測試的'最小單元'。 爲了在一個整齊的組中捆綁幾個單元測試,我應該使用eg。類。 – loldrup

+1

是或頂層對象。也可以繼承測試方法 - 例如,抽象超類可以聲明'形式'值並定義一個使用這些值的測試函數,並且從它派生的對象可以定義這些值並繼承測試函數。 –