Java 集成测试最佳实践

Java 集成测试最佳实践,java,spring,junit,integration-testing,Java,Spring,Junit,Integration Testing,我在做一个项目,面临着以下问题 我在类中创建了一个方法来查找某个用户并应用逻辑,如果返回了id为null或具有某个值的其他用户对象,则会引发异常 我为所有测试用例编写了单元测试,现在在callee中我忘记了为null id添加条件 处理此类错误的最佳做法是什么。我应该用所有测试用例编写集成测试,还是集成测试应该只有一条快乐的路径 其次,在集成测试中,使用嵌入式数据库代替实际数据库是否好?我曾考虑使用嵌入式数据库进行集成测试,但如何测试特定于供应商的查询,例如oracle中的rownum和mysq

我在做一个项目,面临着以下问题

我在类中创建了一个方法来查找某个用户并应用逻辑,如果返回了id为null或具有某个值的其他用户对象,则会引发异常

我为所有测试用例编写了单元测试,现在在callee中我忘记了为null id添加条件

处理此类错误的最佳做法是什么。我应该用所有测试用例编写集成测试,还是集成测试应该只有一条快乐的路径

其次,在集成测试中,使用嵌入式数据库代替实际数据库是否好?我曾考虑使用嵌入式数据库进行集成测试,但如何测试特定于供应商的查询,例如oracle中的rownum和mysql中的limit。在我的实际环境中,我们使用oracle和嵌入式数据库,我可以使用h2。我使用的是普通jdbc


谢谢

这是我在特定于供应商的情况下会做的-因为Oracle中的
rownum
和MySQL中的
limit
都限制了返回的行数,所以我会在我这边创建一个抽象,比如说,
myLimit
。根据供应商数据库的选择,它映射到
rownum
limit

一旦你有了上述内容,以及涵盖应用程序所有方面的任何其他必要抽象,你就可以开始设计集成测试了。对于所有供应商,我建议首选:(i)实际数据库连接,(ii)嵌入式数据库,以及(iii)模拟数据库。DB本身不必太大

基于QA指标,如果您觉得DB连接已通过其他测试进行了彻底测试,那么我将使用集成测试中的嵌入式或模拟DB


正如您所看到的,答案取决于系统其余部分的测试情况!祝你好运。

关于单元和集成测试。

让我们澄清一下这些测试类型之间的区别

单元测试应该覆盖单元,这意味着我们要覆盖相当小的一段代码。因此,单元测试通常覆盖非常具体的情况,通常有很多单元测试,因为对于一个小方法,程序可能有几个方向,所有方向都应该覆盖。所有干扰单元测试的事情,例如,一些调用外部方的方法,与方法的业务逻辑没有真正的联系,都必须被模仿

相反,在集成测试中,不建议模拟任何东西,因为您希望测试整个管道,这意味着您的测试应该通过不同的模块(类),而不模拟任何东西。这种类型的测试通常非常庞大,因此,我建议不要在集成测试中处理一些小的验证检查,因为从我的观点来看,这样做是不值得的


如果我从我的角度正确理解了您的情况,那么您的方法应该检查null,而不是调用方。它基于这样一个事实:您永远不知道谁将调用您的方法。您的方法应该期望输入参数中允许的所有不同值。

作为一般准则,任何测试(单元或集成)都应该测试所有返回类型及其值范围。集成测试将模拟生产代码的所有方面。它可以用模拟对象替换实际对象。请参阅此以了解详细信息。不清楚从第二句开始的最后一段是什么意思,也许可以澄清一下?谢谢你的名字。。我编辑了问题的第二部分