8

我是自动化测试和 dbUnit 的新手。所以我很感激你的建议。

我将创建一个测试套件,它将按以下方式运行:

  • 创建内存 H2 数据库
  • 运行 DDL 脚本来创建表
  • 运行 dbUnit 以插入将被所有测试使用的初始数据(我们称之为STATE0 )。
  • 运行测试

直到那里对我来说看起来不错,但我不明白的是,如何在测试运行后将数据库恢复到STATE0并更改数据?

我可以用 dbUnit 做吗?
还是用别的东西?
我应该在每次测试之前重新创建数据库吗?

简单的不在测试中提交事务对我来说是不合适的,因为测试最终会运行不止一个事务,可能不止一个数据库连接。

4

2 回答 2

7

@BeforeClass如果您正确编写,@Before@After方法, DBUnit 可以自动完成四项工作。例如,在我们的项目中,使用 Derby,一个这样的测试用例看起来像

public class MyTest {
    protected static IDataSet getDataSet() throws Exception {
        URL url = MyTest.class.getClassLoader().getResource("MyDataSet.xml");
        return new XmlDataSet(new FileInputStream(url.getPath()));
    }

    private static JdbcDatabaseTester databaseTester;

    @BeforeClass
    public static void setUpClass() throws Exception {
        // Init test environment, session etc.
        databaseTester = new JdbcDatabaseTester(
                "org.apache.derby.jdbc.ClientDriver",
                "jdbc:derby://localhost:1527/myschema", 
                "username", "password");
        databaseTester.setDataSet(getDataSet());
    }

    @AfterClass
    public static void tearDownClass() {
        // Close session etc.
    }

    @Before
    public void setUp() throws Exception {
        databaseTester.onSetup();
    }

    @After
    public void tearDown() throws Exception {
        databaseTester.onTearDown();
    }

    @Test
    public void test() throws Exception { ... }
}

此代码将 DB 模式(的子集)恢复到MyDataSet.xml每次测试后定义的状态。(请注意,正如@Pascal 评论的那样,重置可能并不总是完整的 - 如果测试修改了不在数据集中的表,它不会受到@Before/@After方法的影响。)

于 2010-09-28T14:21:00.980 回答
5

要将数据库初始化为初始数据集,只需在测试用例中实现这些方法:

@Override
protected DatabaseOperation getSetUpOperation() throws Exception
{
    return DatabaseOperation.CLEAN_INSERT; // by default (will do DELETE_ALL + INSERT)
}

@Override
protected DatabaseOperation getTearDownOperation() throws Exception
{
    return DatabaseOperation.NONE; // by default
}

如果您的某些测试在空表中插入行(例如,未在初始数据集中定义),您可能会有外键约束。

只需在您的数据集中添加此空表,无需任何行:

<mydb_mypopulatedtable id="1" name="toto" alias="funky"/>
<mydb_mypopulatedtable id="2" name="titi" alias="groovy"/>
<mydb_mypopulatedtable id="3" name="tutu" alias="creepy"/>

<mydb_myemptytable />

这里,myemptytable 有一个指向 mypopulatedtable 的外键。如果未定义 myemptytable,DBUnit 将尝试删除 mypopulatedtable,但由于约束而失败。如果已定义,DBUnit 将删除之前的 myemptytable 行。

于 2011-02-25T10:51:29.403 回答