现有的答案当然是好的,但是我还没有看到有人在这个问题上解决过这种基本的误解:
在任何时候,所有单元测试都必须通过
不可以。这肯定不是事实。在我开发软件时,NCrunch通常是棕色(构建失败)或红色(测试失败)。
当我准备将提交推送到源控制服务器时,NCrunch需要变为绿色(所有测试均通过),因为那时其他人可能会依赖我的代码。
这也涉及创建新测试的主题:测试应声明代码的逻辑和行为。边界条件,故障条件等。当我编写新的测试时,我尝试在代码中识别这些“热点”。
单元测试记录了我如何期望代码被调用-前提条件,期望的输出等。
如果测试随着更改而中断,我需要确定代码还是测试错误。
附带一提,单元测试有时与“测试驱动开发”并驾齐驱。TDD的原则之一是坏的测试是您的指南。如果测试失败,则需要修复代码以使测试通过。这是本周早些时候的具体示例:
背景:我编写并现在支持我们的开发人员使用的用于验证Oracle查询的库。我们进行的测试断言该查询符合某个期望值,这使情况变得很重要(在Oracle中不重要),并且只要无效查询完全符合期望值,就可以适当地批准无效查询。
相反,我的库使用Antlr和Oracle 12c语法解析查询,然后将各种断言包装在语法树本身上。诸如此类,它是有效的(没有引发解析错误),其所有参数均由参数集合满足,数据读取器读取的所有预期列均出现在查询中,等等。所有这些都是已转至在不同的时间生产。
周一,我的一位工程师向我发送了一个查询,该查询在周末失败了(或者应该在失败时成功了)。我的图书馆说语法不错,但是当服务器尝试运行它时,它就崩溃了。当他查看查询时,很明显为什么:
UPDATE my_table(
SET column_1 = 'MyValue'
WHERE id_column = 123;
我加载了该项目,并添加了一个断言该查询无效的单元测试。显然,测试失败了。
接下来,我调试失败测试,通过代码加强,我希望它抛出异常,并想通了,ANTLR的是在开放的括号引发错误,只是没有在某种程度上前面的代码期待。我修改了代码,确认测试现在是绿色的(通过),并且没有其他人在该过程中出现问题,已提交并已推送。
这大概花费了20分钟,在此过程中,我实际上对库进行了重大改进,因为它现在支持以前被忽略的所有错误。如果我没有对该库进行单元测试,那么研究和解决该问题可能要花几个小时。