【问题标题】:Junit 4 how to initialize in test suite and pass it to test classesJunit 4如何在测试套件中初始化并将其传递给测试类
【发布时间】:2015-03-14 21:49:02
【问题描述】:


Junit4中有没有办法将一些预初始化的数据(例如您在使用'@RunWith(Suite.class)'注释的类中使用'@ClassRule'初始化的http连接)传递给所有子(即套件)测试类?还有如何保证套件中的类不能单独运行?

例如

class A {
    private HttpClient client;
    @Test
    public void someTest() {
        client.execute(...);
        ...
    }
 }

 @RunWith(Suite.class)
 @Suite.SuiteClasses({A.class})
 public class Suite {
     private static HttpClient client;
     @ClassRule
     public static ExternalResource resource= new ExternalResource() {
         @Override
         protected void before() throws Throwable {
             client = new DefaultHttpClient();
         } 
     }

谢谢,

稻谷

【问题讨论】:

    标签: java junit test-suite


    【解决方案1】:

    我认为您无法使用 JUnit 实现这一目标。

    我看到的唯一可能性是使用抽象类并在每个测试类中继承该抽象类。

    public abstract class AbstractTest {
      @ClassRule
      public static ExternalResource resource= new ExternalResource() {
        //...
      }
    }
    
    public class MyTest extends AbstractTest {
    }
    

    还有如何保证套件中的类不能单独运行?

    我认为这也不可能。

    但你为什么要这样呢? 修复一个失败的测试后,您真的要重新运行所有测试以检查一个测试是否正常工作吗? (当然,修复可能会带来副作用,但是当您知道您的修复测试正在工作时,您可以重新运行所有测试。) 此外,测试应该能够独立运行。

    【讨论】:

    • 确实,您可以通过继承或以多种方式(组合...)进行相互化/分解。但总的来说,正如 nrainer 所说,Junit 测试不应该相互依赖。然后,您将使用许多工具,因为它们会假设您的测试是原子的。例如,使用 Maven 和 surefire,测试可以并行运行,等等……
    • 嗨@nrainer,如果你使用抽象类,它可以作为实例变量提供给子类吗?我不想要引用 TestSuite.configuredResource 的有点丑陋的方式(其中 configureResource 是我在 ClassRule 的 before 方法中设置的静态变量)?另外,我询问是否可以阻止单个测试类的原因是因为我希望在套件开始时进行一些客户端初始化并供单个类使用。我的目标是将测试分成两个或更多类,只是为了可维护性,而不是每次都进行昂贵的初始化(仅在套件启动时)。
    • "它可以作为实例变量提供给子类吗?"这取决于修饰符,但我不知道是否需要公开。 “[...] 为什么我问是否可以阻止单个测试类 [...]” 这不是问题,只需添加一个条件。如果客户端变量为空,进行初始化并赋值,否则什么都不做。
    【解决方案2】:

    当您使用 JUnit 的开箱即用 Runners 时,您将获得从测试 Suite 对其子测试的任何访问权限。测试类的实例化在框架内部完成。

    如果您想将信息/状态从一个测试传递到另一个测试,我想实现某种“上下文”。例如。 Singleton 带有静态 Getter 和 Setter 用于上下文,允许您的套件存储 Object 并稍后从您的测试中读取它。

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 2017-01-14
      相关资源
      最近更新 更多