首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于MetaProgramming的自动化测试

基于MetaProgramming的自动化测试
EN

Stack Overflow用户
提问于 2016-07-14 12:32:02
回答 1查看 430关注 0票数 0

我想学习使用元编程的测试自动化。我googled它找不到任何thing.can,有人建议我在哪里可以获得关于“如何使用元编程使测试自动化变得更容易”的信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-14 13:56:39

这是一个宽泛的话题,但由于元编程的“黑暗角落”,没有多少关于它的文章。

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

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

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

我有点同意,但我认为这些都是您想要的弱版本,因为每个版本都对源代码所能看到的和所做的有严格的限制。您真正想要的是一个元编程工具,它可以访问源程序中的所有内容(是的,注释也是!)这些工具被称为程序转换系统(PTS);它们通过解析源代码和对程序的解析表示进行操作。(我碰巧造了其中一个,请看我的简历)。然后,PTSes可以对代码进行准确的分析,并/或对代码进行可靠的更改,并通过更改重新生成有效的源。PS: PTS可以将所有其他元编程技术作为特例来实现,因此它严格地说是更通用的。

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

元编程至少有两个领域可以发挥作用:

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

集合.

测试结果的收集取决于测试的性质。许多测试都集中在“这个白色/黑匣子是否正常工作”上?假设测试是以某种方式编写的,它们必须能够访问被测试的盒子,能够以一种实际的方式调用该盒子,确定结果是否正确,并且经常将结果列表到测试后的质量评估中。

访问是第一个问题。要测试的黑匣子可能不容易被测试框架访问:由一个UI事件驱动,在一个非公开的例程中,深埋在另一个很难访问的函数中。您可能需要元编程来“临时”修改程序,以提供对需要测试的框的访问(例如,将私有方法更改为Public,以便从外部调用它)。这样的更改只在测试项目的持续时间内存在;您可以丢弃修改后的程序,因为除了测试结果之外,没有人想要它。是的,您必须确保应用于使事物可见的代码转换不会更改程序功能。

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

最后,人们可能希望记录的不仅仅是“测试失败/通过”。通常,准确地知道哪些代码被测试(“测试覆盖率”)是有用的。您可以对应用程序进行测试,以收集已执行的数据;下面是如何对代码块进行测试:使用PTS的http://www.semdesigns.com/Company/Publications/TestCoverage.pdf。可以使用更复杂的工具来捕获通过代码执行哪些路径的信息。未发现的代码和/或未发现的路径,显示了哪些地方没有应用测试,您可以说不知道该程序做了什么,更不用说它是否以一种简单的方式出现了错误。

测试的生成

某些人/事物必须生成测试;我们已经讨论了如何生成设置环境部分。功能部分呢?假设程序已经调试(例如,已经通过手工测试和修复),人们可以使用元编程来检测代码以捕获黑匣子的执行结果(例如,实例执行后条件)。通过执行这个程序,人们就可以产生(根据定义)“正确地产生”结果,这些结果可以转化为一个测试。通过这种方式,可以为现有的程序构建大量的回归测试;这些测试对于验证对程序的进一步增强是有价值的--不会破坏程序的大部分功能。

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

回避测试

只测试不信任的代码(您肯定不是在测试JDK吗?)任何由可靠方法构造的代码都不需要测试( JDK是这样构造的,或者至少Oracle很乐意让您理解它)。

元编程可以用来从规范或DSL自动生成代码,以可重传的方式。这样生成的代码是正确的构造(我们可以争论什么程度的严格性),而且不需要测试。您可能需要测试DSL表达式是否实现了您想要的功能,但是您不必担心生成的代码是否正确。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38374287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档