当前位置: 首页 > 面试题库 >

在JUnit中,在每个“ @Test”之后和每个“ @After”之前应用“ @Rule”

凌经赋
2023-03-14
问题内容

我有一个测试套件,可以在其中退出系统@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

希望这可以帮助!



 类似资料:
  • 我想在测试套件中的每个测试之前和之后运行其他设置和拆卸检查。我看过赛程,但不确定它们是否是正确的方法。我需要在每次测试之前运行设置代码,并且需要在每次测试后运行拆卸检查。 我的用例是检查没有正确清理的代码:它会留下临时文件。在我的设置中,我将检查文件,在拆解中我也会检查文件。如果有额外的文件,我希望测试失败。

  • 我有一个测试方法,看起来像: 并行工作使用可关闭的资源来控制生命周期,该资源在方法中关闭: 问题是:方法是在完成工作之前和等待超时到期之前调用的。 怎么可能?那我该怎么解决呢?

  • 问题内容: 我正在使用jQuery和jQuery UI。我体验到用户有时会多次触发ajax调用,因为触发调用的按钮/链接在单击后不会立即被禁用。为了防止这种情况的发生,现在我在“ beforeSend”操作中禁用按钮/链接。 这是典型的Ajax Call对我来说的样子: 但是我不想在每个Ajax调用中添加此按钮禁用逻辑。有什么办法全局定义每次在/ after和ajax-call之前都会被调用的函数

  • 问题内容: 目前,我正在阅读“ JUnit in action”一书。在这本书中,我发现以下内容: JUnit会在调用每个@Test方法之前创建测试类的新实例。这有助于提供测试方法之间的独立性,并避免测试代码中的意外副作用。因为每个测试方法都在新的测试类实例上运行,所以我们无法在所有测试方法之间重用实例变量值。 现在,我看不出这种方法有什么意义: 例如: 对于测试类CalculatorTest,没

  • 我想我错过了一些关于之前和之前的方式。我有一个规范文件,加载数据从夹具在之前的方法。这些数据中的一部分被用在之前的函数中,然后又被用在之前的函数中,以及在实际的测试中。规范文件包含2个测试。第一个测试按预期执行。第二个失败,因为beForeeach表示来自夹具的值之一未定义。 我的期望是,如果我加载数据从一个夹具在之前的方法,它应该是可用于所有测试规范文件。 在执行“检查按钮栏的状态”时,测试be

  • 问题内容: 我想在我运行的每个bash命令之后打印日期。 这可以帮助我了解远离键盘时要执行多少命令。 我知道我能做 获取日期,但我不知道在bash上执行的每个命令之后如何甚至是否可以运行此命令。 我也会对在每个命令 之前 运行同一命令感兴趣,因此我可以知道一个命令花费了多长时间。 可能吗? 我应该编辑什么文件? 例如: 如果我也可以介绍以下功能,我将很高兴: 第一个日期是我运行程序的日期,第二个是