如果圈复杂度为 1 的方法是较大交互的一部分,我是否应该对其进行单元测试?
Should I unit test methods that have a cyclomatic complexity of 1 if they are part of larger interactions?
我是单元测试的新手,所以请原谅一个天真的问题。
我听说过不测试任何圈复杂度为 1 的想法。这对我来说很有趣 b/c 我做了很多事件之间的交互测试。例如,按下按钮,触发事件,在演示者上引发事件,演示者修改模型,然后演示者调用视图上的方法。所以我测试以确保在引发按钮事件时调用视图上的正确方法。
此序列中的每个方法的圈复杂度可能为 1。没有分支。但是,如果我想将其作为 "system"(即视图、演示者、模型)进行测试,则圈复杂度更高——将事件序列中的所有 1 值方法相加。
所以我的问题是,当人们建议我不需要测试圈复杂度为 1 的方法时,他们不是在谈论用于测试 类 之间交互的交互测试,就像我描述的那样以上?
我这周两次遇到这个想法 - 一次是在 Mark Seemann Pluralsight 视频中,一次是在这里:http://webquali.com/blog/67/15-ways-to-write-beautiful-code.html。
不要从规定的 TDD 的角度来考虑测试,而是将其作为一种工具,让您的开发人员能够发现在您的 CI 运行集成时是否发生了意外的行为变化。
作为一个简单的例子,您在评论中提供了一个计算器方法:
public int Minus(int a, int b) => a - b;
不为其编写单元测试可能会导致有人不小心更改代码,如下所示:
public int Minus(int a, int b) => a + b;
这将不可避免地在运行时破坏整个应用程序。
因此通常的建议是:对于您团队中的开发人员编写的每一行代码,都应该有一个相应的隐式或显式断言。
当我们说隐式断言时,我们的意思是,例如:
public object ReturnMytype() => new MyType { MyProperty = "a" };
[TestMethod]
public void ReturnMytype_SetsMyPropertytoA(){
Assert.AreEqual("a", (new MyClass().ReturnMytype as MyType).MyProperty);
}
在上面的单元测试中,ReturnMytype
returns 正确类型的断言是隐式的(类型转换)。这个测试足以断言被测方法的两种行为——它 returns 一个 MyType
并且它将 MyProperty
设置为 "a".
我是单元测试的新手,所以请原谅一个天真的问题。
我听说过不测试任何圈复杂度为 1 的想法。这对我来说很有趣 b/c 我做了很多事件之间的交互测试。例如,按下按钮,触发事件,在演示者上引发事件,演示者修改模型,然后演示者调用视图上的方法。所以我测试以确保在引发按钮事件时调用视图上的正确方法。
此序列中的每个方法的圈复杂度可能为 1。没有分支。但是,如果我想将其作为 "system"(即视图、演示者、模型)进行测试,则圈复杂度更高——将事件序列中的所有 1 值方法相加。
所以我的问题是,当人们建议我不需要测试圈复杂度为 1 的方法时,他们不是在谈论用于测试 类 之间交互的交互测试,就像我描述的那样以上?
我这周两次遇到这个想法 - 一次是在 Mark Seemann Pluralsight 视频中,一次是在这里:http://webquali.com/blog/67/15-ways-to-write-beautiful-code.html。
不要从规定的 TDD 的角度来考虑测试,而是将其作为一种工具,让您的开发人员能够发现在您的 CI 运行集成时是否发生了意外的行为变化。
作为一个简单的例子,您在评论中提供了一个计算器方法:
public int Minus(int a, int b) => a - b;
不为其编写单元测试可能会导致有人不小心更改代码,如下所示:
public int Minus(int a, int b) => a + b;
这将不可避免地在运行时破坏整个应用程序。
因此通常的建议是:对于您团队中的开发人员编写的每一行代码,都应该有一个相应的隐式或显式断言。
当我们说隐式断言时,我们的意思是,例如:
public object ReturnMytype() => new MyType { MyProperty = "a" };
[TestMethod]
public void ReturnMytype_SetsMyPropertytoA(){
Assert.AreEqual("a", (new MyClass().ReturnMytype as MyType).MyProperty);
}
在上面的单元测试中,ReturnMytype
returns 正确类型的断言是隐式的(类型转换)。这个测试足以断言被测方法的两种行为——它 returns 一个 MyType
并且它将 MyProperty
设置为 "a".