aep*_*eus 8 testing unit-testing
我对单元测试有点困惑.我看到了自动化测试等方面的价值.我想也许一个很好的例子是帮助我理解的最好方法.假设我有一个二元搜索功能,我想要进行单元测试.
现在在测试中,我想知道的事情:搜索是否找到第一个元素,最后一个元素和其他元素?搜索是否正确比较unicode字符.搜索是否处理符号和其他"痛苦"字符.单元测试会覆盖这个,还是我错过了?你会如何为我的二分查找编写单元测试?
function search(collection, value){
var start = 0, end = collection.length - 1, mid;
while (start <= end) {
mid = start + ((end - start) / 2);
if (value == collection[mid])
return mid;
if (collection[mid] < value)
end = mid - 1;
else
start = mid + 1;
}
return mid;
}
Run Code Online (Sandbox Code Playgroud)
单元测试的Psuedo代码很可爱.
所以,我们可能会:
function testFirst(){
var collection = ['a','b','c','x','y','z'],first = 'a', findex = 0;
assert(seach(collection,first),findex);
}
function testLast(){
var collection = ['a','b','c','x','y','z'], last = 'z', lindex = 5;
assert(seach(collection,last),lindex);
}
Run Code Online (Sandbox Code Playgroud)
您对单元测试的期望是正确的;这很大程度上是关于验证和验证预期的行为。
我认为许多人错过单元测试的一个价值是它的价值随着时间的推移而增加。当我编写一段代码并编写单元测试时,我基本上只是测试了该代码是否执行了我认为应该执行的操作,它没有以我选择检查的任何方式失败,等等。这些都很好事物,但它们的价值有限,因为它们表达了您当时对系统的了解;他们无法帮助您解决您不知道的事情(我的算法中是否存在我不知道并且没有想到测试的狡猾错误?)。
在我看来,单元测试的真正价值是它们随着时间的推移而获得的价值。该值有两种形式:文档价值和验证价值。
文档值是单元测试的值,表示“这是代码作者期望这段代码执行的操作”。很难夸大这种东西的价值;当您参与的项目有大量未记录的遗留代码时,让我告诉您,这种文档价值就像一个奇迹。
另一个价值是验证价值;随着代码在项目中的存在,事情会被重构、改变和转移。单元测试可以验证您认为以某种方式工作的组件将继续以这种方式工作。这对于帮助发现项目中出现的错误非常有价值。例如,更改数据库解决方案有时可能是透明的,但有时,这些更改可能会导致某些事情的工作方式发生意外的变化;对依赖于 ORM 的组件进行单元测试可以捕获底层行为中关键的细微变化。当你有一段代码多年来一直完美运行,并且没有人想到考虑它在失败中的潜在作用时,这确实很有用;这些类型的错误可能需要很长时间才能找到,因为您要查看的最后一个位置是在很长一段时间内坚如磐石的组件中。单元测试提供了“坚如磐石”的验证。
| 归档时间: |
|
| 查看次数: |
1309 次 |
| 最近记录: |