gpt4 book ai didi

java - 在 JUnit 中的每个 '@Rule' 之后和每个 '@Test' 之前应用 '@After'

转载 作者:太空狗 更新时间:2023-10-29 22:39:04 24 4
gpt4 key购买 nike

我有一个测试套件,我在 @After 中退出系统并在 @AfterClass 中关闭浏览器。我正在尝试使用 @Rule 为每种测试方法使用 Selenium 获取失败的测试屏幕截图。我手动检查了 @Rule 只在每个 @Before 之前运行,但我想在 @Test 之后和 @After 之前设置它。我找不到简单的解决方案。任何帮助将不胜感激。

public class MorgatgeCalculatorTest  {

@Before
public void before(){
System.out.println("I am before");
}
@BeforeClass
public static void beforeclass(){
System.out.println("I am beforeclass");
}
@Test
public void test(){
System.out.println("I am Test");
}
@Test
public void test2(){
System.out.println("I am Test2");
}
@After
public void after(){
System.out.println("I am after");
}
@AfterClass
public static void afterclass(){
System.out.println("I am afterclass");

}
@Rule
ExpensiveExternalResource ExpensiveExternalResource = new ExpensiveExternalResource();

static class ExpensiveExternalResource implements MethodRule {
public ExpensiveExternalResource(){
System.out.println("I am rule");
}

@Override
public Statement apply(Statement arg0, FrameworkMethod arg1, Object arg2) {
// TODO Auto-generated method stub
return null;
}
}

我得到的输出是

I am beforeclass
I am rule
I am before
I am Test
I am after
I am rule
I am before
I am Test2
I am after
I am afterclass

最佳答案

由于规则的设置方式,您不能在@before 之后或@after 之前设置规则。您可以将规则想象成放在测试方法上的 shell。第一个继续的 shell 是@before/@after。此后应用@rules。

做您想做的事情的一种快速方法是完全避免@After。可以创建一个规则,以便在方法失败时截取屏幕截图,然后在代码之后执行您的。它不如@After 漂亮,但它确实有效。 (我还实现了 TestRule,因为 MethodRule 已贬值)。

public class MortgageCalculatorTest  {
@Before
public void before(){
System.out.println("I am before");
}

@BeforeClass
public static void beforeclass(){
System.out.println("I am beforeclass");
}

@Test
public void test(){
System.out.println("I am a Test");
}

@Test
public void test2(){
System.out.println("I am a Failed Test");
fail();
}

@AfterClass
public static void afterclass(){
System.out.println("I am afterclass");

}

@Rule
public ExpensiveExternalResource ExpensiveExternalResource = new ExpensiveExternalResource();

public static class ExpensiveExternalResource implements TestRule {


// public ExpensiveExternalResource(){}


public class ExpansiveExternalResourceStatement extends Statement{

private Statement baseStatement;

public ExpansiveExternalResourceStatement(Statement b){
baseStatement = b;
}

@Override
public void evaluate() throws Throwable {
try{
baseStatement.evaluate();
}catch(Error e){
System.out.println("I take a Screenshot");
throw e;
}finally{
after();
}
}

//Put your after code in this method!
public void after(){
System.out.println("I am after");
}
}

public Statement apply(Statement base, Description description) {
return new ExpansiveExternalResourceStatement(base);

}


}
}

规则的所有工作都在一条语句中完成。 org.junit.runners.model.Statement 是代表一组代码的类。因此,这里的 apply 方法接收您正在放置 shell 的代码包。 Apply 返回执行您提供的代码包的语句,并用 try/catch 语句包围它以捕获方法失败。

此方法的输出是:

I am beforeclass
I am before
I am a Test
I am after
I am before
I am a Failed Test
I take a Screenshot
I am after
I am afterclass

希望这对您有所帮助!

关于java - 在 JUnit 中的每个 '@Rule' 之后和每个 '@Test' 之前应用 '@After',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com