如果圈复杂度为 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".