我相信大多数人都在编写大量的自动化测试,而且在进行单元测试时你也遇到了一些常见的陷阱.
我的问题是你是否遵循任何编写测试的行为规则以避免将来出现问题?更具体一点:良好单元测试的属性是什么,或者您如何编写测试?
鼓励语言不可知的建议.
language-agnostic tdd integration-testing unit-testing testing-strategies
最近,我们公司已开始每周测量代码中的功能的圈复杂度(CC),并报告哪些功能已经改善或恶化.所以我们开始更多地关注功能的CC.
我已经读过CC可以非正式地计算为1 +函数中的决策点数(例如if语句,for循环,select等),或者通过函数的路径数...
我知道减少CC的最简单方法是重复使用Extract Method重构...
有些事情我不确定,例如以下代码片段的CC是什么?
1)
for (int i = 0; i < 3; i++)
Console.WriteLine("Hello");
Run Code Online (Sandbox Code Playgroud)
和
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Console.WriteLine("Hello");
Run Code Online (Sandbox Code Playgroud)
它们都做同样的事情,但是由于for语句,第一个版本是否有更高的CC?
2)
if (condition1)
if (condition2)
if (condition 3)
Console.WriteLine("wibble");
Run Code Online (Sandbox Code Playgroud)
和
if (condition1 && condition2 && condition3)
Console.WriteLine("wibble");
Run Code Online (Sandbox Code Playgroud)
假设语言进行了短路评估,例如C#,那么这两个代码片段具有相同的效果......但是第一个片段的CC是否更高,因为它有3个决策点/ if语句?
3)
if (condition1)
{
Console.WriteLine("one");
if (condition2)
Console.WriteLine("one and two");
}
Run Code Online (Sandbox Code Playgroud)
和
if (condition3)
Console.WriteLine("fizz");
if (condition4)
Console.WriteLine("buzz");
Run Code Online (Sandbox Code Playgroud)
这两个代码片段做了不同的事情,但它们是否有相同的CC?或者第一个片段中的嵌套if语句是否具有更高的CC?即嵌套if语句在精神上更难理解,但是在CC中反映出来了吗?