允许我的Junit测试与真实数据库进行交互是不好的做法吗?

use*_*003 5 java junit flyway

我正在构建一个基本的HTTP API和一些操作,比如POST /users在数据库中创建一个新的用户记录.

我知道我可以模拟这些调用,但在某种程度上我想知道让我的Junit测试在真实(测试)数据库上运行是否更容易?这是一种不好的做法吗?是否只应对真实数据库进行集成测试?

我正在使用flyway来维护我的测试模式和maven以进行构建,因此我可以让它在每个构建中使用适当的模式重新创建测试数据库.但是我也担心在每次测试之间我需要一些额外的开销来维护/清理数据库的状态,我不确定是否有一个好的方法可以做到这一点.

Yug*_*ngh 6

单元测试用于测试单个代码单元.这意味着您通过编写仅测试方法的内容来编写单元测试.如果存在外部依赖关系,那么您可以模拟它们,而不是实际调用和使用这些依赖项.

因此,如果您编写代码并且它与真实数据库交互,那么它不是单元测试.说,由于某种原因,您对db的调用失败,那么单元测试也将失败.单元测试的成功或失败不应该依赖于外部依赖,例如db.您必须假设db调用成功,然后使用一些模拟框架(Mockito)对数据进行硬编码,然后使用该数据测试您的方法.


Nik*_*s P 2

通常,这取决于情况。

在具有大量 JUnit 测试的大型项目中,性能开销可能是一个问题。此外,在数据库中设置测试数据所需的工作时间以及测试所需的概念,即不干扰其他测试的测试数据,而并行执行 JUnit 测试是仅针对数据库进行测试的一个非常大的论据如果需要的话,否则就嘲笑它。

在小型项目中,这个问题可能更容易处理,因此您始终可以使用数据库,但即使在小型项目中,我个人也不会这样做。