使用MetaProgramming进行测试自动化

时间:2016-07-14 12:32:03

标签: testing metaprogramming

我想学习使用元编程的测试自动化。我用谷歌搜索它找不到任何东西。任何人都建议我一些资源在哪里可以获得有关“如何使用元编程使测试自动化变得容易”的信息?

1 个答案:

答案 0 :(得分:0)

这是一个广泛的主题,并没有写很多关于它,因为"黑暗角落"元编程。

你的意思是"元编程"?

作为背景,我认为元编程是一种工具(我们称之为"元编程工具")用于检查或修改应用软件以实现某些效果的任何活动。

很多人都会考虑"反思"成为一种元编程;其他考虑(C ++风格)模板是元编程;一些建议面向方面的编程。

我有点同意,但认为这些都是你想要的弱版本,因为每个版本都对源代码所看到或做的事情有严格的限制。您真正想要的是一个元编程工具,可以访问源程序中的所有(是的,也是注释!)这些工具称为Program Transformation Systems (PTS);它们通过解析源代码并对解析的程序表示进行操作来工作。 (我碰巧建立其中一个,看看我的生物)。然后,PTS可以准确地分析代码,和/或对代码进行可靠更改,并使用更改重新生成有效源。 PS:PTS可以将所有其他元编程技术作为特殊情况实现,因此它更为通用。

在哪里可以使用元编程进行测试?

元编程至少有两个方面可能起作用:

1)从测试中收集信息 2)生成测试 3)避免测试

<强>收藏。

测试结果的收集取决于测试的性质。许多测试都集中在&#34;这个白/黑盒子是否正常运行&#34;?假设测试是以某种方式编写的,他们必须能够访问被测盒子, 能够以现实的方式调用该框,确定结果是否正确,并经常将结果制成表格,以便进行后测试质量评估。

访问是第一个问题。测试框架可能无法轻松访问要测试的黑盒子:由UI事件驱动,在非公共例程中,深埋在另一个很难进入的功能中。 您可能需要元编程以暂时&#34;修改程序以提供对需要测试的框的访问(例如,将Private方法更改为Public,以便可以从外部调用它)。这种变化仅在测试项目期间存在;你抛弃修改过的程序,因为除了测试结果,没有人想要它。是的,您必须确保应用于使事物可见的代码转换不会改变程序功能。

第二个问题是在现实环境中运行目标黑匣子。每个代码模块都在一个假设数据和环境正确的世界中运行。配置。测试程序可以通过调用许多程序元素或使用自己的自定义代码来明确地设置该世界;这通常是测试例程的大部分,而且这段代码难以编写且易碎(测试中的应用程序不断变化;对世界的假设也是如此)。有人可能会使用元编程来检测应用程序收集测试可能需要运行的环境,从而避免编写所有设置代码的问题。

最后,人们可能想要记录的不仅仅是&#34;测试失败/通过&#34;。通常,确切地知道测试的代码(&#34;测试覆盖率&#34;)是很有用的。可以检测应用程序以收集已执行的数据;这里是如何为代码块做的:http://www.semdesigns.com/Company/Publications/TestCoverage.pdf使用PTS。可以使用更复杂的检测来捕获有关通过代码执行的路径的信息。未覆盖的代码和/或未覆盖的路径显示未应用测试的位置,并且您可能对程序的功能一无所知,更不用说它是否以直接的方式出错。

生成测试

某人/某物必须生成测试;我们已经讨论过如何生成环境设置部分。功能部分怎么样? 假设程序已经被调试(例如,已经手动测试并且已经修复),可以使用元编程来检测代码以捕获执行黑盒子的结果(例如,实例执行)后置条件)。通过执行该程序,然后可以产生(按照定义)&#34;正确地产生&#34;结果可以转化为测试。通过这种方式,可以为现有程序构建各种各样的回归测试;这些将有助于验证程序的进一步增强功能,而不是打破其大部分功能。

函数通常在不同的输入范围上具有定性不同的行为(例如,对于x <10,产生的x + 1,否则产生x * x)。理想情况下,人们希望为每个定性不同的结果(例如,x <10,x> = 10)提供测试,这意味着人们想要对输入范围进行划分。 Metaprogrammning也可以通过枚举模块中的所有(部分)路径,并提供控制每个路径的谓词来帮助实现。 每个单独的谓词代表感兴趣的输入空间分区。

避免测试

只测试一个不信任的代码(当然你不是在测试JDK?)任何由可靠方法构造的代码都不需要测试(构建JDK)这样,或者至少甲骨文很高兴让你相信它。)

元编程可用于以可接受的方式从规范或DSL自动生成代码。这样生成的代码是正确的构造(我们可以争论什么程度的严谨性),并且不需要测试。您可能需要测试DSL表达式是否达到了您所期望的功能,但您不必担心生成的代码是否正确。