Junit测试用例
嗨我是新编写JUnit测试用例。任何人都可以用这种方法帮助我吗?Junit测试用例
private boolean validateDate(Date date, String datesInCsv) {
boolean dateAlreadyExist= false;
final String[] dateVal = datesInCsv.split(",");
List<Date> allDates = new ArrayList<Date>();
for (final String stringDate : dateVal) {
allDates .add(DateUtil.parseDate(stringDate ,"MM/dd/yyyy"));
}
if (allDates .contains(date)) {
dateAlreadyExist= true;
}
return dateAlreadyExist;
}
如何在写这些类型的方法的测试用例之前开始以及应该记住什么?
通常你不直接测试私有方法,但是你可以通过测试调用它的方法来获得测试覆盖率。没有什么说你不能测试它。
您将需要使用反射(或Groovy)来测试它,因为它是私有的。对于要测试的内容,您需要测试null和其他意外的输入值以及任何边界条件(真正的大日期,非常小的等等)。另外在你的情况下,你可能想检查意外的日期格式。
Junit网站(和junit谷歌或*搜索)可以为您提供更多关于单元测试的想法。
希望这会有所帮助。
测试纯粹主义者会回答“如何开始”,说的是开始测试,而不是实施。但是,当你有自己的方法时,你已经超过了这一点。
和cjstheno是正确的,测试私有方法是,这个,很奇怪。
所以我通常与测试开始围绕无效输入
@Test(expected = IllegalArgumentException.class)
public void nullDateIsBadInput() {
yourclass.validateDate(null, "01/01/2000");
}
然后我测试方法
@Test
public void janFirstIsInInput() {
Assert.assertTrue("janFirst is in inuputs",
yourclass.validateDate(janFirst, "01/01/2000, 01/02/2000");
}
@Test
public void janFirstIsNotInInput() {
Assert.assertFalse("janFirst is not in inputs",
yourclass.validateDate(janFirst, "04/01/2000, 01/02/2000");
}
不要忘了把可选的消息到assert调用的主旨,当你回到代码时,它会让你更容易。
最后,在测试工作完成后,不要忘记重构代码(以及测试!)返回值allDates .contains(date)
而不是将其存储在冗余变量中。
从@Paul开始,不要忘记在迭代周围测试边界。由于datesInCsv
可以是多个日期,因此请测试空字符串,表示单个日期的字符串以及表示多个日期的字符串。
然后,您可以对可疑输入进行预测,然后回到您的要求。这包括诸如开始,结束或字符串中的日期之间的空格。尾随逗号怎么样?这些类型的可疑事物作为测试非常重要,因为它们可以作为未来开发人员的需求文档的一种形式,这些开发人员可能会迟来,希望“优化”事情。请记住,测试的目标不仅仅是确保今天的事情正在发挥作用,而且还要以可执行形式保存这些期望,以确保明天它们也是真实的。
这是一个非常好的答案(尽管assertTrue和assertFalse拼写错误),并且我只是+1了。有一点我不同意 - “不要忘记将可选消息放入声明中”。对于这种风格的测试,每种测试方法都有一个断言,我认为这不合理;实际上它违反了DRY。 JUnit报告失败方法的名称 - 在这些示例中,方法的名称与断言中的消息完全相同。我宁愿不要使用可选消息;如果你的测试中有很多断言,现在是时候把它分解成更小的测试。 – 2012-02-26 08:31:47