使用元编程的测试自动化
Test-Automation using MetaProgramming
我想使用元学习测试自动化 programming.i 用谷歌搜索找不到任何 thing.can 有人建议我一些资源 我在哪里可以获得有关 "how to use Meta Programming for making test automation easy" 的信息?
这是一个广泛的话题,由于 "dark corners" 的元编程,关于它的文章并不多。
"metaprogramming"是什么意思?
作为背景,我认为元编程是任何 activity,其中使用工具(我们称之为 "metaprogramming tool")来检查或修改应用程序软件以达到某种效果。
很多人认为"reflection"是一种元编程;其他人认为(C++ 风格的)模板是元编程;有人建议 aspect-oriented 编程。
我有点同意,但认为这些是您想要的弱版本,因为每个版本都对其可以查看或对源代码执行的操作有严格的限制。您真正想要的是一个元编程工具,它可以访问源程序中的所有内容(是的,还有注释!)这样的工具称为Program Transformation Systems (PTS);它们通过解析源代码并对程序的解析表示进行操作来工作。 (我碰巧构建了其中一个,请参阅我的简历)。 PTSes 然后可以准确地分析代码,and/or 对代码进行 可靠的 更改,并使用更改重新生成有效的源代码。 PS: PTS 可以将所有其他元编程技术作为特例来实现,因此严格来说更通用。
在哪里可以使用元编程进行测试?
元编程至少可以在 2 个领域发挥作用:
1) Collection 来自测试的信息
2) 生成测试
3) 避免测试
Collection.
Collection 的测试结果取决于测试的性质。许多测试都集中在 "is this white/black box functioning correctly"?假设测试是以某种方式编写的,他们必须能够访问被测框,
能够以现实的方式调用该框,确定结果是否正确,并经常将结果制成表格,以便 post-testing 可以进行质量评估。
访问是第一个问题。测试框架可能不容易访问要测试的黑盒:由 UI 事件驱动,在 non-public 例程中,深埋在另一个难以访问的函数中。
您可能需要元编程来 "temporarily" 修改程序以提供对需要测试的框的访问(例如,将私有方法更改为 Public 以便可以从外部调用它)。此类更改仅在测试项目期间存在;你扔掉修改后的程序,因为除了测试结果,没有人想要它。是的,您必须确保用于使事物可见的代码转换不会改变程序功能。
第二个问题是在现实环境中练习目标黑盒。每个代码模块 运行 在假设数据和环境都已配置的世界中 "properly"。测试程序可以通过调用大量程序元素或使用自己的自定义代码来显式设置该世界;这通常是测试例程的主体,而且这段代码难以编写且脆弱(被测应用程序不断变化;它对世界的假设也是如此)。可以使用元编程来检测应用程序以 收集 测试可能需要 运行 的环境,从而避免编写所有设置代码的问题。
最后,人们可能想要记录的不仅仅是 "test failed/passed"。准确知道测试了哪些代码通常很有用 ("test coverage")。可以检测应用程序以收集 what-got-executed 数据;以下是如何为代码块执行此操作:http://www.semdesigns.com/Company/Publications/TestCoverage.pdf 使用 PTS。可以使用更复杂的工具来捕获有关已执行代码的 路径 的信息。未发现的代码,and/or 未发现的路径,显示未应用测试的地方,您可以说对程序的功能一无所知,更不用说它是否以直接的方式存在错误。
生成测试
Someone/thing 必须 产生 测试;我们已经讨论了如何生成 set-up-the-environment 部分。功能部分呢?
假设程序已经过调试(例如,已经手动测试并修复),可以使用元编程来检测代码以捕获黑盒执行的结果(例如, 实例执行 post-conditions)。通过运行该程序,可以生成(根据定义)"correctly produces" 结果,这些结果可以转化为测试。通过这种方式,可以为现有程序构造大量 回归 测试;这些将有助于验证程序的进一步增强不会破坏其大部分功能。
通常一个函数在不同的输入范围内具有不同性质的行为(例如,对于 x<10,产生 x+1,否则产生 x*x)。理想情况下,人们希望为每个定性不同的结果(例如,x<10,x>=10)提供测试,这意味着人们希望对输入范围进行划分。元编程可以lp 也在这里,通过枚举模块的所有(部分)路径,并提供控制每个路径的谓词。
每个单独的谓词代表感兴趣的输入 space 分区。
避免测试
一个只测试不信任的代码(你肯定不是在测试 JDK?)任何通过可靠方法构建的代码都 不需要 测试(JDK 就是这样构建的,或者至少 Oracle 很高兴让您相信它)。
元编程可用于以可靠的方式从规范或 DSL 中自动生成 代码。这样生成的代码是correct-by-construction(严谨到什么程度大家可以争论),不需要测试。您可能需要测试 DSL 表达式是否实现了您想要的功能,但您不必担心生成的代码是否正确。
我想使用元学习测试自动化 programming.i 用谷歌搜索找不到任何 thing.can 有人建议我一些资源 我在哪里可以获得有关 "how to use Meta Programming for making test automation easy" 的信息?
这是一个广泛的话题,由于 "dark corners" 的元编程,关于它的文章并不多。
"metaprogramming"是什么意思?
作为背景,我认为元编程是任何 activity,其中使用工具(我们称之为 "metaprogramming tool")来检查或修改应用程序软件以达到某种效果。
很多人认为"reflection"是一种元编程;其他人认为(C++ 风格的)模板是元编程;有人建议 aspect-oriented 编程。
我有点同意,但认为这些是您想要的弱版本,因为每个版本都对其可以查看或对源代码执行的操作有严格的限制。您真正想要的是一个元编程工具,它可以访问源程序中的所有内容(是的,还有注释!)这样的工具称为Program Transformation Systems (PTS);它们通过解析源代码并对程序的解析表示进行操作来工作。 (我碰巧构建了其中一个,请参阅我的简历)。 PTSes 然后可以准确地分析代码,and/or 对代码进行 可靠的 更改,并使用更改重新生成有效的源代码。 PS: PTS 可以将所有其他元编程技术作为特例来实现,因此严格来说更通用。
在哪里可以使用元编程进行测试?
元编程至少可以在 2 个领域发挥作用:
1) Collection 来自测试的信息 2) 生成测试 3) 避免测试
Collection.
Collection 的测试结果取决于测试的性质。许多测试都集中在 "is this white/black box functioning correctly"?假设测试是以某种方式编写的,他们必须能够访问被测框, 能够以现实的方式调用该框,确定结果是否正确,并经常将结果制成表格,以便 post-testing 可以进行质量评估。
访问是第一个问题。测试框架可能不容易访问要测试的黑盒:由 UI 事件驱动,在 non-public 例程中,深埋在另一个难以访问的函数中。 您可能需要元编程来 "temporarily" 修改程序以提供对需要测试的框的访问(例如,将私有方法更改为 Public 以便可以从外部调用它)。此类更改仅在测试项目期间存在;你扔掉修改后的程序,因为除了测试结果,没有人想要它。是的,您必须确保用于使事物可见的代码转换不会改变程序功能。
第二个问题是在现实环境中练习目标黑盒。每个代码模块 运行 在假设数据和环境都已配置的世界中 "properly"。测试程序可以通过调用大量程序元素或使用自己的自定义代码来显式设置该世界;这通常是测试例程的主体,而且这段代码难以编写且脆弱(被测应用程序不断变化;它对世界的假设也是如此)。可以使用元编程来检测应用程序以 收集 测试可能需要 运行 的环境,从而避免编写所有设置代码的问题。
最后,人们可能想要记录的不仅仅是 "test failed/passed"。准确知道测试了哪些代码通常很有用 ("test coverage")。可以检测应用程序以收集 what-got-executed 数据;以下是如何为代码块执行此操作:http://www.semdesigns.com/Company/Publications/TestCoverage.pdf 使用 PTS。可以使用更复杂的工具来捕获有关已执行代码的 路径 的信息。未发现的代码,and/or 未发现的路径,显示未应用测试的地方,您可以说对程序的功能一无所知,更不用说它是否以直接的方式存在错误。
生成测试
Someone/thing 必须 产生 测试;我们已经讨论了如何生成 set-up-the-environment 部分。功能部分呢? 假设程序已经过调试(例如,已经手动测试并修复),可以使用元编程来检测代码以捕获黑盒执行的结果(例如, 实例执行 post-conditions)。通过运行该程序,可以生成(根据定义)"correctly produces" 结果,这些结果可以转化为测试。通过这种方式,可以为现有程序构造大量 回归 测试;这些将有助于验证程序的进一步增强不会破坏其大部分功能。
通常一个函数在不同的输入范围内具有不同性质的行为(例如,对于 x<10,产生 x+1,否则产生 x*x)。理想情况下,人们希望为每个定性不同的结果(例如,x<10,x>=10)提供测试,这意味着人们希望对输入范围进行划分。元编程可以lp 也在这里,通过枚举模块的所有(部分)路径,并提供控制每个路径的谓词。 每个单独的谓词代表感兴趣的输入 space 分区。
避免测试
一个只测试不信任的代码(你肯定不是在测试 JDK?)任何通过可靠方法构建的代码都 不需要 测试(JDK 就是这样构建的,或者至少 Oracle 很高兴让您相信它)。
元编程可用于以可靠的方式从规范或 DSL 中自动生成 代码。这样生成的代码是correct-by-construction(严谨到什么程度大家可以争论),不需要测试。您可能需要测试 DSL 表达式是否实现了您想要的功能,但您不必担心生成的代码是否正确。