2012-03-02 57 views
16

执行的顺序我有一个测试情况下我想补充一个实体,更新和删除相同。因此,执行顺序在这里很重要。我希望它是:指定的JUnit测试用例

  1. 创建
  2. 更新
  3. 删除

奇怪的是,只是一个测试案例(满分15),JUnit的执行它按以下顺序:

  1. 删除
  2. 更新
  3. 创建。

我如何告诉JUnit的以特定的顺序来执行呢?在其他情况下,JUnit完全正常(串行执行)。那么为什么JUnit在这种情况下表现得异常呢?

相关代码如下片段:

private static Date date; 
    private static int entity; 
    static Parking p; 
    public ParkingTests(String name) { 
     super(name); 
    } 
    public void testAdd() throws Exception { 
      //Add code here 
    } 
    public void testUpdate() throws Exception { 
      //update code here 
    } 
    public void testDelete() throws Exception { 
      //delete code here 
    } 
    } 

它变得怪异。我作为套件的一部分运行了很多测试用例。如果我只运行停车箱,订单将保持不变。如果我与其他人一起运行,有时会保留它,有时候不会!

+1

你能展示这个类的源代码吗? – 2012-03-02 05:46:42

+1

测试用例将成为测试类中的一种方法。让你的测试依赖于某个执行顺序并不是一个好的做法,详细描述如下:http://stackoverflow.com/q/3693626/422353 – madth3 2012-03-02 05:52:18

+0

是的,我已经读过并意识到单元测试,在理想的世界里,不应按特定顺序执行。可悲的是,这是如何在这里工作。出租车在创建和处罚之前无法删除。所以订单变得重要。 – crazyaboutliv 2012-03-02 07:31:12

回答

17

你的那种情况尴尬,因为它让你感觉很糟,保持重复工作,以隔离测试(见下文) - 但请注意,大部分的重复可以拉出到setUptearDown@Before@After)方法,所以你不需要额外的代码。提供的测试没有运行,所以慢慢地停止经常跑他们,最好是浪费位CPU在清洁测试的名称。

public void testAdd() throws Exception { 
     // wipe database 
     // add something 
     // assert that it was added 
} 
public void testUpdate() throws Exception { 
     // wipe database 
     // add something 
     // update it 
     // assert that it was updated 
} 
public void testDelete() throws Exception { 
     // wipe database 
     // add something 
     // delete it 
     // assert that it was deleted 
} 

另一种方法是一切坚持与多个断言一个测试,但是这是很难理解和维护,并给出了一个少一点信息时,测试失败:

public void testCRUD() throws Exception { 
     // wipe database 
     // add something 
     // assert that it was added 
     // update it 
     // assert that it was updated 
     // delete it 
     // assert that it was deleted 
} 

测试与数据库或者任何类型的集合或存储都是棘手的,因为一个测试可以通过将垃圾留在数据库/集合中而始终影响其他测试。即使你的测试没有明确地相互依赖,他们仍然可能互相干扰,特别是如果其中一个失败。

在可能的情况下,为每个测试使用新的实例,或者擦除数据,理想情况下尽可能简单 - 例如,对于数据库来说,擦除整个表更有可能成功,而不是一个非常具体的删除,您可能会意外地弄错了。

更新:在测试开始时擦拭数据通常会更好,因此一次失败的测试运行不会影响下次运行。

+0

我可以使用你的第二个建议,并把它们写在一个测试中,但像你说的那样,很难维护。我的大部分测试也是这样写的(1然后2然后3),只有这个是给出问题! (是的,我每次都使用一个干净的数据库,没有这样的问题) – crazyaboutliv 2012-03-02 09:38:55

+0

@crazyaboutliv:我会说不要依赖正在执行的测试来完成你的工作。正如junit doc本身所说的那样,测试方法执行顺序不能保证。此外,我还看到了从IDE运行时junit测试通过的情况,但在作为构建的一部分运行时失败。没有人会想要进入这样的情况。 – 2012-03-04 03:33:07

+0

@DNA你的答案对于在CRUD之前插入值可以添加到setUp()的单个表格很好,但是如果我有多个表要测试呢?对于可以进入setUp()和tearDown()的所有表,我不能有共同的任务。 – Prudhvi 2015-07-24 20:33:21

19

通常JUnit测试(测试方法)应该不依赖于彼此。 以下是junit FAQ

采取每个测试在其自己的测试夹具运行到隔离通过其他测试所做的 变化的测试。也就是说,测试不共享的测试夹具 对象的状态。因为测试是分离的,它们可 可以以任何顺序运行......测试方法调用的顺序不是 保证。

所以,如果你想要做一些常见的初始化的东西,那么你可以做到这一点与在@After标注的方法@Before和清理注释的方法。否则,如果您的测试类中的所有测试方法都不需要该初始化,那么您可以将它放在私有方法中,并从测试中适当地调用它们。

请注意,如果您仍然想要进行测试排序,那么您可以看看TestNG

0

你可以做什么:

  • 清理数据库中的每个测试
  • 开始,首先测试第一逻辑操作之前。当你有足够的信心,假设它是正确的,并移动到下一个等...
  • 首先写白盒测试,但从黑盒测试开始。例如,如果您的数据库中存在触发器或类似信息,请从此开始。
2

如果你想运行秩序“就像他们存在于源代码” JUnit测试, 看到我注意到这个位置:

How to run junit tests in order as they present in your source code

但是,这的确不是一个好想法,测试必须是独立的。

+0

或者你可以定义一个测试套件..这是一个更简单,更容易。 – 2013-04-02 00:35:11

+0

@ThomasW当你已经有5000多个测试时,它并不容易...... – kornero 2013-05-22 09:47:15

5

通常,JUnit不保证测试用例的排序。不能保证按字母顺序排列,也不保证文件中的顺序。如果测试的顺序很重要,那么一个取决于以前的输出。如果第一个失败了怎么办?我们是否应该对后来的(和相关的)测试打扰呢?可能不会。

所以,如果我们有这样的:

@Test 
public void first(){...} 

@Test 
public void second() {...} 

@Test 
public void third() {...} 

我们不知道他们将要运行什么样的顺序在因为我们希望他们为了去,我们可能不应该打扰第二或者第三行驶。前一个(或多个)失败,我们可以做到这一点,而不是:

@Test 
public void firstThree(){ 
    first(); 
    second(); 
    third(); 
} 

public void first(){...} 
public void second() {...} 
public void third() {...} 

请注意,我们只有一个@Test这个时候,它保证了排序。

11

如果您确定您想要为您的测试执行执行顺序,那么JUnit 4.11现在通过注释支持这一点。更多讨论,参阅this thread - 基本上,你可以使用

@FixMethodOrder 

保证一些测试顺序的方式。尽管如此,这是令人沮丧的。

6

如果您使用的是Java 7那么您应该知道Junit从java.lang.Class中使用“Method [] getDeclaredMethods()”获取所有测试的列表。你可以从这个方法的javadoc或者从junit文档中读取:“返回数组中的元素没有排序并且没有任何特定的顺序。”“,但是在之前的jvm中,实现方法列表是按照它们的顺序排列的源代码。

这是从这个blog采取的,他提供了一个解决方法。

+0

注意:你所引用的博客是由某人[在你提供答案之前已经提供了答案]写的(http://stackoverflow.com/a/ 13265376/365237) – eis 2016-10-29 11:04:36

+0

所以,谢谢你指出。如果我没有记错的话,我已经阅读了博客,并想出了一些我正在进行的单元测试。当我看到这个问题时,我想其他人可能也想知道。我想我应该更仔细地阅读所有答案。我的意思是没有进攻。如果@ kornero想要,我会删除帖子。 – 2016-11-01 20:53:09