unit-testing - 具有复合条件和短路的环复杂性

我正在大学的“软件质量保证”课程中学习“循环复杂性”,当您在谓词陈述或节点中有复合条件时,我很难理解它的工作原理。我已经看到了Cyclomatic Complexity的多种定义,在课堂上使用的主要定义是

V(G) = # of predicate nodes (with outdegree = 2) + 1


因此,对于这样的程序图,我们的圈复杂度为两个:

V(G) = 2




我还看到了圈复杂度的定义为

V(G) = # edges - # nodes + 2


这也适用于上面给出的图形。但是,我们对于谓词节点具有复合条件。并且我们考虑了用于自动短路的语言和系统,在我看来,左下方的图表必须扩展到该图表。如果是这种情况,那么即使在真实的源代码中,我们的循环复杂度是否也会变为3,即使我们可能只有一个if语句还是V(G)= 2?

之所以令人困惑,是因为我看到的关于环复杂性的大多数定义都在谈论谓词节点,并且据我所知,谓词可能包含多个短路条件。如果不是这种情况,则考虑到短路性能虽然会提高性能,但实际上会增加圈复杂度。如果给出了源代码,在计算圈复杂度之前,是否必须将所有条件分解成自己的节点,例如左侧的图?

最佳答案

在C(C ++,Java,C#)中,“ &&”运算符使复杂度增加了一个,因为它被定义为使用短路评估。在这种情况下,圈复杂度为3。

http://hissa.nist.gov/HHRFdata/Artifacts/ITLdoc/235/chapter4.htm

“布尔运算符会增加复杂性,或者不增加复杂度,这取决于它们是否具有会导致条件性执行副作用的短路评估语义。”

图4-4具有带注释的源代码和相应的流程图,这些流程图演示了如何确定复杂度。

另见Cyclomatic complexity of IF((A>B) AND (C>D)) and IF((A>B) OR (C>D))

本文翻译自 https://stackoverflow.com/questions/15240922/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 unit-testing testing graph graph-theory cyclomatic-complexity


相关文章:

javascript - 元素不可点击-量角器

java - ActivityInstrumentationTestCase2问题-测试由于我编写测试代码中的invalidate()调用而挂起

javascript - Google图表中具有相同x轴的多个图形

python - pyplot:如何以人类可读的方式显式编号轴

android - 如何自动生成HTML中的Android测试报告

python - 如何模拟单例类方法

testing - 有条件地运行测试,生成标志不起作用

algorithm - 图论深度优先搜索

unit-testing - FitNesse测试页可以单独运行但不能在套件中运行

java - 具有内部对象的Java单元测试