Java 单元测试数据库连接以及有关数据库相关代码和单元测试的一般问题

Java 单元测试数据库连接以及有关数据库相关代码和单元测试的一般问题,java,unit-testing,testing,Java,Unit Testing,Testing,如果我有一个建立数据库连接的方法,如何测试这个方法?在连接成功的情况下返回bool是一种方法,但这是最好的方法吗 从可测试性方法来看,最好将连接方法作为一种方法,将获取数据的方法作为一种单独的方法 另外,如何测试从数据库中获取数据的方法?我可以对预期数据进行断言,但实际数据可以更改,并且仍然是正确的结果集 编辑:最后一点,要检查数据,如果它应该是一个汽车列表,那么我可以检查它们是真实的汽车模型。或者,如果它们是一组web服务器,我可以在系统上有一个现有web服务器的列表,从测试代码中返回,然后得

如果我有一个建立数据库连接的方法,如何测试这个方法?在连接成功的情况下返回bool是一种方法,但这是最好的方法吗

从可测试性方法来看,最好将连接方法作为一种方法,将获取数据的方法作为一种单独的方法

另外,如何测试从数据库中获取数据的方法?我可以对预期数据进行断言,但实际数据可以更改,并且仍然是正确的结果集

编辑:最后一点,要检查数据,如果它应该是一个汽车列表,那么我可以检查它们是真实的汽车模型。或者,如果它们是一组web服务器,我可以在系统上有一个现有web服务器的列表,从测试代码中返回,然后得到测试结果。如果结果不同,则数据是问题,而查询不是问题

你可以从中获取想法。在单元测试DB时,我会选择模拟对象


否则,如果应用程序很大,并且您正在运行长而复杂的单元测试,您还可以虚拟化您的DB服务器,并轻松地将其还原为保存的快照,以便在已知环境中再次运行测试。

首先,如果您涉及数据库,则不再进行单元测试。您已进入集成(用于连接配置)或功能测试区。这些是非常不同的动物

连接方法必须与数据获取分离。事实上,您的连接应该来自一个工厂,这样您就可以共享它。至于测试连接,实际上您所能测试的就是通过连接到DB来确保您的配置是正确的。您不应该尝试测试您的连接池,因为它可能是其他人编写的库(dbcp或c3p0)。此外,您可能无法对此进行测试,因为您的单元/集成/功能测试永远不应该连接到生产级数据库

至于测试数据访问代码是否有效。这是功能测试,涉及很多框架和支持。您需要一个单独的测试数据库,能够在测试期间动态创建模式,将任何静态数据插入表中,并在每次测试后将数据库返回到已知的干净状态。此外,应该实例化此数据库并以这样的方式运行,即两个人可以同时运行测试。特别是如果你有一个以上的开发人员,再加上一个自动测试箱

断言应针对静态数据(例如,不经常更改的状态列表)或在测试期间插入并删除后置词的数据,以避免干扰其他测试


编辑:如前所述,有一些框架可以帮助实现这一点。DBUnit是相当常见的。

< P>如果目标是测试方法的功能,而不是数据库SP或SQL语句,那么您可能需要考虑数据提供者接口意义上的依赖注入。换句话说,您的类使用一个带有返回数据的方法的接口。默认实现使用数据库。单元测试实现有几个选项:

  • 嘲弄(NMock、Moq等),很棒的方式,我活在嘲弄中
  • 内存数据库
  • 具有静态数据的静态数据库

除了第一次,我什么都不喜欢。作为一般规则,接口编程总是更加灵活。

对于数据库连接建立测试:您可以让连接执行非常简单的SQL As测试方法。有些应用服务器有这样的配置,下面的代码段来自JBoss DB配置:

<!--  sql to call on an existing pooled connection when it is obtained from pool 
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>

使用my Acolyte framework(),您可以模拟任何JDBC支持的DB,描述案例(如何处理执行的每个查询/更新)以及在每个案例中返回哪个resultset/updatecount(将装置描述为查询的行列表,更新的计数)

这种连接可以直接用于传递需要JDBC的实例,或者在JDBC URL名称空间
JDBC:acolyte:
中使用唯一id注册,以便通过JDBC URL解析获得代码连接

无论以何种方式创建连接,Acolyte都会将每个连接保持隔离状态,这对于单元测试来说是正确的(不需要对测试数据库进行额外的清理)

由于持久性案例可以分派到不同的独立连接,因此您不再需要一个大的、难以管理的数据库(或fixtures文件):它可以很容易地在各种连接中分割,例如,每个持久性方法/模块一个


我的Acolyte框架可以在纯Java或Scala中使用。

“您还可以虚拟化您的DB服务器,并轻松地将其还原为保存的快照,以便在已知环境中再次运行测试”-这是集成测试,而不是单元测试。您是对的。我可能把话题扩展得离原来的问题有点太远了。而且,在我写这篇文章的时候,三张赞成票都不是你的!那就没有变化了!我会铭记在心的。我不赞成有用的答案,但不是实际的答案。第一段说明了一切。我同意,但需要注意的是,DB版本、配置等之间可能存在一些功能差异。这意味着集成测试是不够的,您应该努力进行另一个级别的测试(E2E、Alpha测试等)连接到生产数据库的克隆数据库并对其进行测试。(编辑-刚刚注意到这是一个非常旧的线程,但可能对新读者有用)我认为这是有用的信息。即使这不是解决问题的正确方法。如果我正在处理连接池库或任何其他涉及连接的库,我希望对其进行单元测试,这会有所帮助。