ceylon.test.TestRunner 测试失败时失败
ceylon.test.TestRunner fails when tests fails
每当测试函数(用 test
注释的函数)包含失败的断言时,断言与抛出异常时具有相同的效果:不会执行该函数中的其他代码行。因此,用 'test' 注释的函数中的 assert 语句与普通 Ceylon 函数中的普通 assert 语句一样工作。这个runs contrary to the documentation,声明普通断言语句可以用于进行单元测试。
因此,运行 下面的代码,我看到语句 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
这是按预期工作的——用 assertEquals
' 替换那些 assert
s 具有相同的效果并打印相同的输出,因为两者做完全相同的事情:如果断言抛出异常失败。
我所知道的所有测试框架在这种情况下的行为方式都相同:断言失败导致异常,从而立即终止测试方法的执行。这是设计使然,因为您不知道一旦违反了一个预期您的程序会做什么——该方法的其余部分可能取决于该断言是否成立,并且可能以不可预测和令人困惑的方式中断。
如果你正在编写像
这样的测试
test
shared void testTwoThings() {
assertEquals { expected = 42; actual = 40 + 2; };
assertEquals { expected = 42; actual = 6 * 9; };
}
你应该改为编写两个测试。
每当测试函数(用 test
注释的函数)包含失败的断言时,断言与抛出异常时具有相同的效果:不会执行该函数中的其他代码行。因此,用 'test' 注释的函数中的 assert 语句与普通 Ceylon 函数中的普通 assert 语句一样工作。这个runs contrary to the documentation,声明普通断言语句可以用于进行单元测试。
因此,运行 下面的代码,我看到语句 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
这是按预期工作的——用 assertEquals
' 替换那些 assert
s 具有相同的效果并打印相同的输出,因为两者做完全相同的事情:如果断言抛出异常失败。
我所知道的所有测试框架在这种情况下的行为方式都相同:断言失败导致异常,从而立即终止测试方法的执行。这是设计使然,因为您不知道一旦违反了一个预期您的程序会做什么——该方法的其余部分可能取决于该断言是否成立,并且可能以不可预测和令人困惑的方式中断。
如果你正在编写像
这样的测试test
shared void testTwoThings() {
assertEquals { expected = 42; actual = 40 + 2; };
assertEquals { expected = 42; actual = 6 * 9; };
}
你应该改为编写两个测试。