问题描述
我有一个测试套件,我在 @After
中退出系统并在中关闭浏览器@AfterClass
。我正在尝试使用 @Rule
来使用Selenium为每种测试方法拍摄失败的测试截图。我手动检查 @Rule
只在每个 @Before
之前运行,但我想在<$ c $之后设置它c> @Test ,在之前。我找不到简单的解决方案。任何帮助将不胜感激。
I have a test suite where I am logging out of the system in @After
and closing the browser in @AfterClass
. I am trying to use @Rule
to take failed test screenshot using Selenium for every test method. I checked manually that @Rule
only runs before every @Before
but I want to set it up after @Test
and before @After
. I couldn't find out simple solution. Any help will be appreciated.
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。
Because of the way that rules are set up, you can't have a rule that comes after @before or before @after. You can think of rules like shells that you put on the test method. The first shell to go on is @before/@after. Thereafter the @rules are applied.
快速做你想做的事就是完全避免@After。可以创建规则,以便在方法失败时执行截屏,然后在代码后执行。它不像@After那么漂亮,但它确实有效。 (我也实施了TestRule,因为MethodRule已被折旧)。
A quick way to do what you want to do is to avoid @After altogether. A rule can be created so that it will take a screenshot if a method fails and then execute yours after the code. It isn't quite as pretty as @After, but it works. (also I implemented TestRule because MethodRule has been depreciated).
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语句包围它以捕获方法失败。
All the work of the rule is done in a statement. A org.junit.runners.model.Statement is a class that represents a bundle of code. So here the apply method receives the bundle of code that you are putting a shell around. Apply returns your statement that executes the bundle of code that you gave it and surrounds it with a try/catch statement to catch the method failures.
这个方法的输出是:
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
希望这会有所帮助!
这篇关于在每个'@Test'之后和JUnit中的每个'@After'之前应用'@Rule'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!