在为分析计算器编写junits时,我意识到为了测试一个简单的功能,我手动创建了带有测试值的存根pojo,这需要更多的时间来编写实际的业务逻辑?
例如,如果我想检查计算总和( person.age ) / count (person)
的函数
现在,在编写java junits时,我模拟了返回一个person对象集合的服务,然后手动创建了每个都有一些年龄的3个人对象。
现在,如果人员班级很大,请说 30-40个字段。是否有一种简单的方法来创建这样的对象?就像从db中提取数据并通过解析从db获取的CSV文件来动态创建对象?
我想知道推荐的方法是什么?
答案 0 :(得分:1)
嗯,关于Unittests的一个基本要点是,它们应该很快。如果单位测试花费的时间太长,人们就会停止执行它。由于这个原因(以及单元测试控制之外的错误的危险,比如数据库被关闭),我不建议将值存储在数据库中。
但你的情况听起来并不像你真的需要填补30-40个字段,是吗?为什么你的班级需要所有这些?如果你这样做,这些字段实际上是有意义的还是你可以用随机数据填充它们?或者除了你要测试的东西之外,每个人都可以拥有相同的数据吗?
就个人而言,我宁愿不访问文件或类似的东西来测试与文件处理无关的东西,所以我会寻找一种方法来限制测试必须做的事情(测试也应该很容易,如果它很长,没有人理解它)。如果必须,我会在数据库上选择一个文件(仅仅因为文件可以存储在测试资源中,并且至少比数据库问题少)。但是,最好的方法可能不需要文件或数据库。
答案 1 :(得分:1)
我建议将逻辑组中的40个字段分开,并为每个组分别测试逻辑。 这意味着:
等等。
最好是让子pojos,每个都有一个组的字段,分别独立测试。 例如,Person可以有一个Address实例,一个Work实例....,都由他们自己测试。
答案 2 :(得分:1)
我建议强烈反对动态地从数据库中提取数据:这可能很容易使您的测试不确定(即如果数据发生变化就能被破坏),并且测试中未检测到/未经测试的错误可能会导致您的平均测试无用。此外,如果您创建"代表性结果"从数据库离线(然后,例如,检查它们)您可能必须特别小心随机选择所选字段,并避免以可泄漏的方式保存敏感或个人信息。
编写测试可能比编写测试系统花费的时间更长,而且不一定表明某些事情是错误的 - 特别是对于任务 - 关键代码。也就是说,您通常可以通过类似的方式优化测试来优化代码。
根据您的模型对象是否可变,您可能需要考虑使用从确定性种子获取的随机化起始值创建Person或PersonBuilder类的测试助手库 。那时,您的测试可能如下所示:
@Test public void testMeanAge() {
// Each person will have a name like "iuwaqeiouzzsxdfv", and a
// randomized age from 18 to 80 (for instance), and so on
Person person1 = PersonBuilder.random().withAge(25).build();
Person person2 = PersonBuilder.random().withAge(28).build();
Person person3 = PersonBuilder.random().withAge(28).build();
when(yourService.getPeople())
.thenReturn(new Person[] { person1, person2, person3 });
assertEquals(27, yourPerson.getMeanAge());
}
创建测试构建器有点冗长而且并不是那么有趣,并且就测试而言,你需要对某些真实的潜在价值有所了解,但是有了这样的东西,你可以创建一个假的非常容易的人 - 这可能会在您的代码库中的其他测试中派上用场。