我已经阅读了很多关于单元测试的内容,但我还没有找到任何可以说明为什么单位测试值得花时间的好例子。
我希望看到实际的Java代码,它显示了如何完成单元测试以及如何捕获可能的错误。
答案 0 :(得分:6)
单元测试不是为了捕捉可能的错误,而是“感觉有点安全”。好的例子是一个代码库比hello world更大的项目,有多个开发人员。只是时间问题,当有人破坏某些东西时,以前的工作是什么。问题是 - 你什么时候知道?部署应用程序后还是在开发期间?
答案 1 :(得分:1)
除了其他评论者所描述的好处之外,我认为单元测试和自动化单元测试对您的生产代码的设计有积极的作用。设计可测试的代码往往会引导您使用更松散耦合的设计,其好处被广泛记录。
答案 2 :(得分:0)
我有一个例子,当我希望我进行单元测试时。
我们使用装饰器模式使用许多BitmapConverter类将IBitmapStream从一种格式转换为另一种格式。 BitmapConvertor类本身就是一个IBitmapStream:
我们有多个位图转换器,用于转换位深度,色彩空间转换(灰度,RGB,CMYK),行填充,颜色分量排序,特殊效果......
我们没有自动化测试。因此,当我们修复任何单个转换器中的错误时,需要大量的手动规则和努力来通过我们的GUI使用许多不同的测试位图来测试转换器。
错误通常很微妙 - 当我们测试链接在一起的多个转换器时,它们首先变得明显 - 并且装饰器模式的缺点是调试困难。 修复一个错误通常会打破另一个案例。
如果我们有一套自动化的测试,那将节省大量的时间和压力。
对于我们的QM部门(或客户)发现的每个错误,我们开发人员都会首先编写单元测试来复制错误,然后修复代码,并确保修复程序没有破坏任何其他测试。
答案 3 :(得分:0)
如果没有一些说明,我不能只举一个例子。编写单元测试非常耗时。因此,很难让经理和同事相信他们的价值。我在开发的编码阶段编写单元测试,它可以将编码持续时间延长50-100%。
值得吗?我认同。单元测试在与其他代码模块集成之前定位错误。此外,如果他们正确检查大多数运行方案,它们在开发结束(维护)后非常有效地定位损坏的代码。
以下是如何使用JUnit 4.x的简单示例:
public class UnitTests {
@org.junit.Test
public void test() {
A a = new A();
String s = " Hello ";
String result = a.trim(s);
assertEquals("The String wasn't trimmed", "Hello", result);
}
}
public class A {
public String trim(String s) {
return s.trim();
}
}
由于String.trim()删除了前导空格和尾随空格,并且由于字符串s包含前导和尾随空格,如果有人稍后更改方法A.trim()以执行其他操作,例如仅修剪前导或尾随空格,此测试将失败。