我正在使用 Junit 来使用 Seleniun WebDriver 运行测试。我正在尝试将我的测试分成功能区域,以便更好地报告错误。我已经创建了测试页面加载/移动文档到其他工作流程的测试。如果页面加载测试失败,或者工作流程移动失败,我想跳过后续页面/工作流程测试。
如果测试A失败,我如何跳过课程中的其余测试或在B类中运行测试?
注意:
我意识到我要问的是“ UNIT TESTS 的不良实践*。但是,我实际上是在使用Junit进行集成和/或自动化测试。(取决于您的定义。)
我已经找到了@Suite.SuiteClasses
和@FixMethodOrder
来订购我的测试类和测试方法。我正在尝试命令它们以逻辑方式运行,测试页面加载,首先,然后将页面的每个功能作为单独的测试。一些功能,将信息移动到其他页面,意味着其他类。我的课程中有一个可能需要半个多小时才能完成。如果pre-req测试失败,我想简短地进行“Dependent”测试,以便更快地获得我的结果/报告。
答案 0 :(得分:0)
我建议您切换到TestNG。检查this。
顺便说一句:当我以前使用Java时 - 差不多一年前 - 我没有找到JUnit这样的解决方案。
答案 1 :(得分:0)
你可以尝试通过Rules接口来操作测试,他们在这里有一个例子: http://www.codeaffine.com/2013/11/18/a-junit-rule-to-conditionally-ignore-tests/
这可能是一个很好的起点。
答案 2 :(得分:0)
通过在@Before或@Test方法中使用Junit's Assume,可以使用
跳过当前测试这是一个例子:
public class Tests{
@Test
public void test1(){
...
}
@Test
public void test2(){
try{
test1();
}catch(AssertionError failExcep){
//test1 failed, skip this test
Assume.assumeTrue(false);
}catch(AssumptionVoilationException skipExcep){
//test1 was skipped, skip this test
Assume.assumeNoException(skipExcep);
}
...
}
}
这个特定的示例将运行两次test1(),但是要添加@FixMethodOrder并捕获在test1期间抛出的任何错误,以在test2中进行引用;我们可以解决这个问题。
此外,此示例未涵盖test1()可能引发的任何其他异常类型,例如空指针异常。将AssumptionVoilationException catch子句编辑为Exception将允许在发生任何异常时跳过test2。如果您还想捕获Error或Throwable,只需添加一个catch子句并放入Assume.assumeTrue(false)即可,如AssertionError。或者,您可以只抛出AssumptionViolatedException
这是虚拟证明版本
@FixMethodOrder
public class Tests{
private Optional<Throwable> testOneThrown;
@Test
public void test1(){
try{
...
}catch(Throwable t){
// test1 throw something, catching it for test2() reference
testOneThrown = Optional.of(t);
/*
* still throwing it for junit normal functions and
* in case test2 ran independently
*/
throw t;
}
//Ran successfully, making reference non-null but empty
testOneThrown = Optional.empty();
}
@Test
public void test2(){
try{
if(testOneThrown == null){
// test1 did not run, thus needs to run
test1();
}else if(testOneThrown.isPresent()){
// test1 ran and threw something
throw testOneThrown.get();
}
//test1 ran and throw nothing
}catch(Throwable thrown){
/*
* something was throw in test1, test1 could have
* failed, could have been skipped, etc. thus skip
* this test.
*/
throw new AssumptionViolatedException("Dependency on test1 failed.", thrown);
}
...
}
}