2016-07-14 82 views
0

我想学习使用元编程的自动化测试。我使用Google搜索找不到任何东西。任何人都可以提供一些资源,我可以从哪里获得有关“如何使用元编程使测试自动化变得简单“?使用MetaProgramming的测试自动化

回答

0

由于元编程的“黑暗角落”,这是一个广泛的主题,并没有写出太多内容。

你是什么意思的“元编程”?

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

许多人认为“反射”是一种元编程;其他考虑(C++风格)模板是元编程;有些人提出面向方面的编程。

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

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

至少有2个区域中,元编程可能会起到一定的作用:

1)从测试 2)代的测试 3)测试

避免收集信息的收集。

测试结果的收集取决于测试的性质。许多测试都关注“这个白色/黑色方块是否正常工作”?假设测试以某种方式写入,他们必须能够访问被测试的盒子, 能够以现实的方式调用该盒子,确定结果是否正确,并且经常将结果列表到测试后的质量评估可以被制造。

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

第二个问题是在现实环境中锻炼目标黑匣子。每个代码模块都运行在一个假定数据和环境都“正确”配置的环境中。测试程序可以通过调用大量程序元素或使用自己的自定义代码来明确设置该世界;这通常是测试例程的主体,而且这些代码很难写和脆弱(被测试的应用程序不断变化,所以对它的假设也是如此)。有人可能会使用元编程来将应用程序安装到收集测试可能需要运行的环境,从而避免编写所有设置代码的问题。

最后,人们可能想要记录的不仅仅是“测试失败/通过”。通常确切地知道哪些代码得到了测试(“测试覆盖率”)是有用的。人们可以通过应用程序来收集执行得到的数据;以下是如何使用PTS的代码块:http://www.semdesigns.com/Company/Publications/TestCoverage.pdf。更复杂的仪器可能被用来捕获有关哪个路径通过代码已被执行的信息。未发现的代码和/或未发现的路径,显示哪些测试尚未应用,并且您对于该程序的功能毫无疑问不知情,更不用说是否以简单的方式进行测试。测试

有人/东西有产生测试

代;我们已经讨论过如何生成环境设置部分。那功能部分呢?假设程序已被调试(例如,已经被手动测试并且是固定的),可以使用元编程来对代码进行测试以捕获执行黑匣子的结果(例如,实例执行后置条件) 。通过锻炼程序,人们就可以产生(根据定义)“正确地产生”可以转化为测试的结果。通过这种方式,可以为现有程序构建大量的回归测试;这些对验证程序的进一步增强不会破坏其大部分功能而言都是有价值的。

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

一个

避免只测试代码的一个不信任(当然你是不是测试JDK?)用一种可靠的方法consructed任何代码不需要测试(JDK的是以这种方式构建,或者至少甲骨文很乐意让你相信它)。

元器件编程可用于自动地以可靠的方式自动生成代码或从规范或DSL中生成代码。这种生成的代码是正确的 - 通过构建(我们可以争论什么程度的严谨),并且不需要测试。您可能需要测试DSL表达式是否达到所需的功能,但您不必担心生成的代码是否正确。

+0

谢谢艾拉,这真的很有帮助! – jaspal