java敏捷集成测试DAO->;的最佳实践是什么;数据库

java敏捷集成测试DAO->;的最佳实践是什么;数据库,java,testing,integration-testing,dao,Java,Testing,Integration Testing,Dao,在Java环境中,针对真实数据库模式对DAO进行敏捷集成测试的最佳实践是什么 (我所说的“敏捷”是指解决这个问题的最精简、自动化和简单的解决方案) 我希望实现测试的自动化,以证明数据访问层与数据库的实际运行实例无缝集成。我们必须针对特定的供应商数据库测试定制SQL。也就是说,如果我们编写T-SQL,我们希望针对SQL Server进行测试 是否应该将一个数据库专用于所有正在运行的测试,但不进行提交?或者每个测试环境都应该有一个专用的数据库 人们如何处理安装和拆卸?DBUnit还在流行吗?Spri

在Java环境中,针对真实数据库模式对DAO进行敏捷集成测试的最佳实践是什么

(我所说的“敏捷”是指解决这个问题的最精简、自动化和简单的解决方案)

我希望实现测试的自动化,以证明数据访问层与数据库的实际运行实例无缝集成。我们必须针对特定的供应商数据库测试定制SQL。也就是说,如果我们编写T-SQL,我们希望针对SQL Server进行测试

是否应该将一个数据库专用于所有正在运行的测试,但不进行提交?或者每个测试环境都应该有一个专用的数据库

人们如何处理安装和拆卸?DBUnit还在流行吗?Spring有何帮助?

我认为一个数据库(每个开发人员)应该可以,只要您确保在测试开始时删除设置的数据。如果不依赖于任何初始数据集,则可以简单地清理表。在这种情况下,DBUnit是一个很好的解决方案

有时,并非所有测试都依赖于某个初始数据集,但只有少数测试主要依赖于select查询。如果您依赖于某一组数据,这将变得很棘手。您仍然可以使用Dbunit进行管理,方法是在每个测试开始之前运行种子数据,并在测试结束时删除,但这会使测试运行更长的时间


在这种情况下,我发现更好的方法是创建一个简单的实用程序类,以保留在测试开始时创建的任何新数据的id,并在测试结束时将其删除。

我想说,DAO的集成测试只需要确保ORM的QL(例如HQL或JDBC SQL)是有效的。我认为有理由假设查询语言本身已经针对多个驱动程序/数据库进行了彻底的测试。接下来,使用诸如HSQLDB之类的“内存中”数据库是合理的

“Spring测试”的目标是集成测试,它在设置IoC上下文、提供事务、设置数据库会话、创建模式然后在测试后将其删除、在测试后回滚事务方面非常出色。。。因此,我对将一些数据库测试标记为集成测试持怀疑态度(我个人认为,只要单元测试不跨越进程边界,并且它们的设置是无摩擦的,它们就构成了一个合理的单元测试)

另一方面,一些好的系统测试应该可以对您的系统进行端到端测试,并使用所有目标数据库进行测试。在设置系统测试时总是需要花费大量的精力,而且,因为您正在测试系统本身,所以在框架和工具包方面有很多适用的帮助

我们必须针对特定的供应商数据库测试定制SQL

因此,您应该为每个供应商数据库创建一套测试

@RunWith(Suite.class)
@Suite.SuiteClasses({})
public class SQLServerTestSuite {

    @BeforeClass
    public static void setUpClass() throws Exception {

    }

    @AfterClass
    public static void tearDownClass() throws Exception {
        // clean database
    }

}
是否应该将一个数据库专用于所有正在运行的测试,但不进行提交

建议您执行SQL命令,但使用rollback命令,因为如果使用commit,您可以更改当前测试的状态,也可以更改其他测试的状态。否则,您可以处理意外行为

对于每个开发人员,建议使用一个。这允许每个用户以他们认为合适的任何方式修改数据库,并通过测试来运行应用程序,而不必担心他们的测试与其他用户的测试之间的任何交互

人们如何处理安装和拆卸

好的方面是,无论我们对数据库内容做了什么更改,它都会使数据库保持与开始测试时完全相同的状态

DBUnit还在流行吗

DBUnit用于将数据库表与包含 期望值。您应该记住DBUnit处理手工编码的设置。然而,尽管这种方法更加彻底,但是开发和维护这类测试却极其繁琐。此外,测试不会检测到新添加的字段或属性缺少映射

春天能帮什么忙

Spring内置了对事务回滚模式的支持,并支持命名参数(),例如,它允许您在多行和可读的xml文件中为每个供应商数据库外部化普通jdbc查询

<?xml version="1.0" encoding="UTF-8"?>
<queries>
    <query name="PERSON_BY_ID">
        <![CDATA[
            select 
                *
            from 
                PERSON
            where
                PERSON.ID = :integerId
        ]]>
    </query>
</queries>

对于dinamic查询,检测查询逻辑中的错误通常很重要,例如使用<而不是,也许我不理解您尝试做什么的目的,或者为什么选择这种测试方法,但是您是否考虑过使用模拟对象?您可以使用模拟对象编写Junits测试,并将其与Hudson集成以实现自动化。您可以模拟DAO、preparedstatements、连接、结果集等


DAO是一种经过验证的模式。JDBC或其他任何可能用于接口的东西也是如此。你是想证明它有效吗?或者您真的想在DAO的方法中测试查询或SQL吗?

我认为
[agile]
标记与问题和答案不太相关,并将其删除。如果您认为是这样,当然可以随意回滚。但是在这种情况下,你也许应该解释什么是敏捷(和非敏捷)集成测试。我相信这是相关的,因为我想从那些以最不显眼的方式解决了这个问题的人那里得到答案。具体地说,我想利用敏捷的简单性和反馈的特点。。。没有所谓的“敏捷”测试。即使一些敏捷方法论关注于工程实践,敏捷实际上更多的是关于组织模式,它不是代码IMO的特征(简单、可测试、可扩展、可维护、高质量等等)。只要我的2美分。我也强烈推荐
<?xml version="1.0" encoding="UTF-8"?>
<queries>
    <query name="PERSON_BY_ID">
        <![CDATA[
            select 
                *
            from 
                PERSON
            where
                PERSON.ID = :integerId
        ]]>
    </query>
</queries>
public class SQLServerQuery {

    public static final String PERSON_BY_ID = "PERSON_BY_ID";

}