为什么不通过使用函数依赖图加速测试?

时间:2011-01-03 03:17:10

标签: testing integration-testing functional-testing

对我而言,如果您有源代码的依赖关系图(显示代码库中所有函数的调用堆栈的树),您应该能够节省大量时间进行功能和集成测试。释放。

基本上,您可以告诉测试人员确切地测试哪些功能,因为从源代码的角度来看其余功能保持不变。

例如,如果您在一段代码中更改了拼写错误,则没有理由再次运行整个测试脚本“以防万一”您引入了一个关键错误。

我的问题是,为什么依赖树没有在软件工程中使用,如果你使用它们,你如何维护它们?有哪些工具可以为C#.NET,C ++和C源代码生成这些树?

5 个答案:

答案 0 :(得分:3)

Visual Studio 2010(Premium和Ultimate)的高端版本与TFS一起提供了这种依赖性分析,称为“影响分析”。

请参阅“Streamline Testing Process with Test Impact Analysis”和 “Identifying Code Change Impact on Tests”。

答案 1 :(得分:0)

理想情况下,您应该使用某种持续集成,特别是如果您有多个开发人员,以便保存在源存储库中的所有内容每天至少测试一次,以确保当所有内容都在一起时确保没有引入新的错误。

我很难修改拼写错误,修复实际错误或添加新功能。

但是,您可以在VS2010中找到您想要的内容,在架构工具(http://blogs.msdn.com/b/somasegar/archive/2009/08/29/architecture-tools-in-vsts-2010.aspx)或VS2008中,这可能会有所帮助:http://www.codeproject.com/KB/cs/depgraph.aspx

我对VS2010图表的问题在于,为了使其完整,它变得太复杂而无法使用。

理想情况下,如果有某种方法可以选择一个函数或一组函数/类,并让它突出显示可能受影响的所有内容,那可能很有用,但只是为了帮助进行一些功能测试,例如,测试人员仍应检查一切,以防发生其他可能导致问题的事情。

答案 2 :(得分:0)

我不同意你的假设。除了执行路径依赖性之外,您的代码还具有数据依赖性。假设你有线程AB在运行。 A调用了a()

shared_memory.x.inc_by(2);

线程B调用b()

assert(shared_memory.x.value % 2 == 0);
...

一切正常(让我们说;))。然后有一天,你改变第一个功能并做

shared_memory.x.inc_by(3);

出于某种原因。如果您只根据a()检查函数,则永远不会测试b(),因为它在某个地方分支 - 它甚至可能是动态回调。

这不仅限于多线程 - 只是选择它作为一个例子。需要检查每个共享数据或与外界通信的地方 - 这意味着“整个程序”实际上是您所列出的语言。

在某种程度上可能会在某些语言中进行此类分析 - 或者是因为缺乏副作用,或者是因为对托管代码进行了一些静态分析 - 但在某些情况下(C / C ++),在许多情况下,你不会从中获得任何有用的数据。

答案 3 :(得分:0)

除了v​​isual studio之外,还有许多可用于此的独立源代码依赖性分析器; Source insight是一个提供依赖图和可视调用堆栈的工具。

答案 4 :(得分:0)

这是一个很好的主意,一旦您开始拥有更昂贵的测试用例(需要花费大量时间来运行)。同样,一个好的测试套件可能会因为没有人在运行而被破坏,因为开发人员没有耐心等待运行。

Softagram是一个独立的源代码依赖性分析器,它还提供信息以用于自动化测试。它分析了所有主流语言,例如Java,C,C ++,C#,Python,PHP,JavaScript,TypeScript等。

当前,有一个REST API提供了Jenkins脚本中通常使用的信息。借助网络挂钩和集中式分析设置,Softagram可以在所有拉取请求出现或被修改时自动分析所有拉取请求,以及所有未合并的分支,然后测试自动化就可以获取尽可能多的最新数据来选择受影响的应用测试用例。

编写一个脚本来向开发人员环境用例请求分析服务器的数据也很容易。当您有大量的测试并且想要从计算机中进行更改之前就希望发现错误时,这使单元测试更加可行。

当前的局限性是Softagram分析器无法安装到开发人员工作站,而是服务器安装。它不分析副作用。在动态语言中,很难正确检测所有函数调用,因此,如果代码中还包含一些#include / import语句,以使分析工具意识到文件之间的依赖性,则很有用。

免责声明:我来自Softagram,我们将其用于上述目的。