Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 是否可以将基于策略的设计与自动化测试结合使用?_Templates_Optimization_Automated Tests_Generic Programming - Fatal编程技术网

Templates 是否可以将基于策略的设计与自动化测试结合使用?

Templates 是否可以将基于策略的设计与自动化测试结合使用?,templates,optimization,automated-tests,generic-programming,Templates,Optimization,Automated Tests,Generic Programming,我正在开发一个数值模拟库,它围绕着由不同计算算法操作的单一数据集合。这些算法非常复杂,它们具有涉及多个参数的不同状态,并且可以互换(在某些语义限制下) 为了避免集合过于臃肿的接口并支持不同的实现等,我考虑使用基于策略的设计。这使集合在存储结构、算法、参数和内部内容之间有了广泛的选择组合 如果我想象我使用GN策略重新设计了我的通用/面向对象的现有设计,我如何选择最佳算法和数据结构?从概念上讲,我需要定义一组策略和一组验证测试用例,并执行参数研究 当使用面向对象编程时,这很容易,因为我可以在运行时确

我正在开发一个数值模拟库,它围绕着由不同计算算法操作的单一数据集合。这些算法非常复杂,它们具有涉及多个参数的不同状态,并且可以互换(在某些语义限制下)

为了避免集合过于臃肿的接口并支持不同的实现等,我考虑使用基于策略的设计。这使集合在存储结构、算法、参数和内部内容之间有了广泛的选择组合

如果我想象我使用GN策略重新设计了我的通用/面向对象的现有设计,我如何选择最佳算法和数据结构?从概念上讲,我需要定义一组策略和一组验证测试用例,并执行参数研究

当使用面向对象编程时,这很容易,因为我可以在运行时确定所有必要的类型及其参数,例如,使用一个基于字符串的抽象工厂,类型名称存储在输入文件中,然后由一个外部脚本更改,该脚本在一系列测试用例上执行客户端应用程序

当N个策略的组合最终成为N个不同的客户端应用程序时,如何使用策略实现这一点


如何以专业的方式将自动测试与基于策略的设计结合起来?

如果您将算法表示为策略,那么您/应该/已经想到了一个非常统一的界面。您可以想象一个“AlgorithmPolicy”处理数据存储中的一些数据并返回结果的一些表示形式

“如果我设想我使用GN策略重新设计了我的通用/面向对象现有设计,我如何选择最佳算法和数据结构?”

如果您的面向对象设计当前使用了策略模式(另请参阅:四人帮书籍),那么您的策略将简单地替换您使用过的每个策略。为您设计的不同策略选择“最佳算法”只需为这些策略确定正确的概念结构/界面。(例如,如果要使用许多不同的数据存储,请确保用于添加/删除/获取数据的接口是统一的。在这里,考虑三个示例并找到共性可能会有所帮助……然后考虑另一个exmaple,确保它符合模式。迭代直到感觉正确为止。)

您仍然有足够的类型检查,只是感觉有点不同(并且您可能会偶尔遇到一些严重的编译错误)

测试只是为您想要介绍的每个配置/策略组合编写一些单元测试。无论如何,您可能已经在编写这些测试了;主要的区别在于,您希望尝试访问指定的接口,而不是针对特定的接口

您可以根据算法策略的验证来验证不同的存储方法。(因此,如果我有一些可以以不同方式存储的算法,我可以在ecah存储机制的一些测试数据上运行该算法,并期望得到相同的结果。)假设您已经正确地指定了接口,您应该只需要为添加的每个附加存储机制编写一个测试

再次强调:最好能有更多关于程序结构的细节,有哪些不同的参数,以及需要传递的参数。(这些代码中有没有开源的

从你所说的,在我看来,你复杂的政策过程可能有这样一个界面:

进程()

为了测试它,我会写: MockAlgorithmPolicy-一个非常简单的算法,验证起来很简单。 MockInternalStuffPolicy—一个非常简单的内部填充策略,不会导致任何集成/报告任何新内容。 MockStoragePolicy—一种非常简单的存储策略,它符合您的存储/存储接口,不会引起很多问题

编写一个测试来验证放在一起的模拟。。。 对于您创建的每个StoragePolicy,编写一个自动测试来验证它:

testSomeStoragePolicy{ 
// has a call to: 
FancyDataStore.Process<MockAlgorithmPolicy, SomeStoragePolicy, MockInternalStuff>() 
// validate... 
}
testSomeStoragePolicy{
//致电:
进程()
//验证。。。
}
这应该证明SomeStoragePolicy按预期工作

然后,对于您的算法,您可以编写:

testSomeAlgorithmPolicy{
FancyDataStore.process<SomeAlgorithmPolicy, MockStoragePolicy, MockInternalStuff>(); 
///Validate. 
}
testSomeAlgorithmPolicy{
进程();
///验证。
}
等等。 这样,您基本上可以为最终编写的每个策略编写一个测试(这似乎是可行的,也不太荒谬)。此外,您还可以添加额外的单元测试,以覆盖可能随时间推移而增加的其他微妙集成


如果你正在寻找关于这个问题的好书,我建议阅读“现代C++编程”;在C++中,它提供了一个关于策略驱动设计的伟大入门。

就像你所暗示的,在运行时没有办法做到这一点!听起来您需要编写一个脚本来生成所有可能的策略排列,并以某种方式将其粘贴到性能测试代码中。我不知道有任何现成的工具可以做这种事情,但也许其他人会:)我正在考虑用一个外部脚本在协同编辑中编辑宏,该脚本将类型名称存储在表中并进行排列,然后调用编译器,然后再调用编译器,自动测试套件:在本例中,客户端应用程序始终具有相同的名称。但是我想知道在实践中使用了什么?谢谢,我得出了相同的结论:我将使用基于策略的设计并确定合理的测试配置。对于这些配置,我将让脚本配置模板,编译并执行测试集。感谢您对本书的提示,我已经读过了,但是关于基于策略的设计的章节没有解释自动测试。:)