如何控制jUnit测试运行的顺序

时间:2015-05-05 13:35:36

标签: java junit

我有这个jUnit测试类

public class TestRaavareBatch {

    @Before
    public void prep(){
        try { new Connector(); } 
        catch (InstantiationException e) { e.printStackTrace(); }
        catch (IllegalAccessException e) { e.printStackTrace(); }
        catch (ClassNotFoundException e) { e.printStackTrace(); }
        catch (SQLException e) { e.printStackTrace(); }
    }

    MySQLRaavareBatchDAO rvb = new MySQLRaavareBatchDAO();

    @Test
    public void testgetRaavareBatch() throws DALException{
        RaavareBatchDTO rvbOBJ = rvb.getRaavareBatch(7);
        assertEquals(7, rvbOBJ.getRaavareId());
        assertEquals(100.0, rvbOBJ.getMaengde(),0.0);
        assertEquals(7, rvbOBJ.getRbId());
    }
    @Test
    public void testgetRaavareBatchList() throws DALException{
        List<RaavareBatchDTO> rvbOBJ = rvb.getRaavareBatchList();
        assertEquals(rvbOBJ.size(), 8);
    }
    @Test
    public void testgetRaavareBatchListId() throws DALException{
        List<RaavareBatchDTO> rvbOBJ = rvb.getRaavareBatchList(5);
        assertEquals(rvbOBJ.size(), 2);
    }
    @Test
    public void testcreateRaavareBatch() throws DALException{
        RaavareBatchDTO test;
        rvb.createRaavareBatch(test = new RaavareBatchDTO(8, 8, 200.0));
        RaavareBatchDTO rvbOBJ = rvb.getRaavareBatch(8);
        assertEquals(8, rvbOBJ.getRbId());
        assertEquals(200.0, rvbOBJ.getMaengde(),0.0);
        assertEquals(8, rvbOBJ.getRbId());
    }
    @Test
    public void testupdateRaavareBatch() throws DALException{
        RaavareBatchDTO test;
        rvb.updateRaavareBatch(test = new RaavareBatchDTO(8, 7, 100.0));
        RaavareBatchDTO rvbOBJ = rvb.getRaavareBatch(8);
        assertEquals(7, rvbOBJ.getRaavareId());
        assertEquals(100.0, rvbOBJ.getMaengde(),0.0);
    }
}

它连接到一个包含7行的数据库,在我运行最后一个测试“updateRaavareBatch”后,我创建了一个新行,因此testgetRaavareBatchList()中列表的大小将为8.但它给了我一个错误因为它在创建新行之前计算大小.. 在创建新行并更新后,如何运行testgetRaavareBatchList()

2 个答案:

答案 0 :(得分:3)

在测试数据库中的查询,插入和删除时,我曾经有类似的东西。

我结束了下面的内容,以确保测试独立性:

  • 使用@Before方法
  • 准备数据库连接
  • @After
  • 中回滚
  • 将一些插入内置于私有而非@Test注释的实用程序方法中以避免重复
  • 需要时调用实用程序方法的@Test方法,并使用断言完成工作

在另一个更难的情况下,我使用@BeforeClass方法创建了一个嵌入式数据库,并在@AfterClass中将其销毁

但你应该从不依赖测试订单。

答案 1 :(得分:1)

您可以在测试类上使用@FixedMethodOrder注释。

一个简单的例子如下:

import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters;

//Running test cases in order of method names in ascending order
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderedTestCasesExecution {
    @Test
    public void secondTest() {
        System.out.println("Executing second test");
    }

    @Test
    public void firstTest() {
        System.out.println("Executing first test");
    }

    @Test
    public void thirdTest() {
        System.out.println("Executing third test");
    }
}

Output:

Executing first test
Executing second test
Executing third test 

但是关于您的特定测试场景只是一件事。在您的情况下,最好使用适当的@Before@After方法来设置和回滚数据库测试。稍后,如果你的代码库足够大,你可能会遇到一个测试没有正确清理并使另一个随机测试用例失败的情况。

参考文献:

Simple TestCase source

JUnit Javadoc for the @FixMethodOrder

Another decent page on JUnit