有条件地忽略JUnit 4中的testing
好的,所以@Ignore
注释对于标记不应该运行testing用例是很好的。
但是,有时我想忽略基于运行时信息的testing。 一个例子可能是如果我有一个并发testing,需要在一定数量的核心的机器上运行。 如果这个testing是在一个单处理器机器上运行的,我认为只是通过testing是不正确的(因为它还没有运行),而且肯定不能通过testing并破坏构build。
所以我希望能够在运行时忽略testing,因为这似乎是正确的结果(因为testing框架将允许构build通过,但loggingtesting不运行)。 我相当肯定注释不会给我这种灵活性,并且怀疑我需要手动为有问题的类创buildtesting套件。 然而,文档并没有提到任何有关这一点,通过API来看,它也不清楚如何以编程方式(即我如何编程创build一个Test
或类似的实例相当于@Ignore
注释创build的实例?)。
如果有人在过去做过类似的事情,或者对我能做些什么还有一个很好的想法,我很乐意听到这个消息。
JUnit的方法是在运行时这样做是org.junit.Assume
。
@Before public void beforeMethod() { org.junit.Assume.assumeTrue(someCondition()); // rest of setup. }
您可以在@Before
方法中或在testing本身中执行,但不能在@After
方法中执行。 如果你在testing中自己做,你的@Before
方法将会运行。
假设失败导致testing被忽略。
编辑:为了与来自junit-ext的@RunIf
注释进行比较,他们的示例代码如下所示:
@Test public void calculateTotalSalary() { assumeThat(Database.connect(), is(notNull())); //test code below. }
更不用说,以这种方式从Database.connect()
方法捕获和使用连接要容易得多。
您应该签出Junit-ext
项目。 他们有RunIf
注释执行条件testing,如:
@Test @RunIf(DatabaseIsConnected.class) public void calculateTotalSalary() { //your code there } class DatabaseIsConnected implements Checker { public boolean satisify() { return Database.connect() != null; } }
[代码示例取自他们的教程]
在JUnit 4中,另一个选项可能是创build一个注释来表示testing需要满足您的自定义条件,然后使用自己的扩展默认运行器并使用reflection,将您的决定基于自定义条件。 它可能看起来像这样:
public class CustomRunner extends BlockJUnit4ClassRunner { public CTRunner(Class<?> klass) throws initializationError { super(klass); } @Override protected boolean isIgnored(FrameworkMethod child) { if(shouldIgnore()) { return true; } return super.isIgnored(child); } private boolean shouldIgnore(class) { /* some custom criteria */ } }
快速注意: Assume.assumeTrue(condition)
忽略其余的步骤,但通过testing。 要使testing失败,请在条件语句中使用org.junit.Assert.fail()
。 像Assume.assumeTrue()
一样工作, Assume.assumeTrue()
通过testing。