我如何控制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()

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

我以以下下文结束,以确保测试独立性:

  • @Before方法中准备数据库连接
  • @After中的回滚
  • 将一些插入物放入私有的 @Test带注释的实用方法避免重复的方法
  • 在需要时,@Test方法称为实用程序方法,并在断言中完成了工作

在另一种困难的情况下,我在@BeforeClass方法中创建了一个嵌入式数据库,并在@AfterClass

中将其销毁

但是您应该永远不要依靠测试顺序。

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

一个简单的例子是:

导入org.junit.fixmethodorder;导入org.junit.test;导入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方法来设置和回滚数据库测试。稍后,如果您的代码库足够大,您可能会遇到一个测试未正确清理并使另一个随机测试柜失败的情况。

参考:

简单的测试柜源

@fixmethodorder的junit javadoc

Junit上的另一个不错的页面

最新更新