Templates 是否可以将基于策略的设计与自动化测试结合使用?
我正在开发一个数值模拟库,它围绕着由不同计算算法操作的单一数据集合。这些算法非常复杂,它们具有涉及多个参数的不同状态,并且可以互换(在某些语义限制下) 为了避免集合过于臃肿的接口并支持不同的实现等,我考虑使用基于策略的设计。这使集合在存储结构、算法、参数和内部内容之间有了广泛的选择组合 如果我想象我使用GN策略重新设计了我的通用/面向对象的现有设计,我如何选择最佳算法和数据结构?从概念上讲,我需要定义一组策略和一组验证测试用例,并执行参数研究 当使用面向对象编程时,这很容易,因为我可以在运行时确定所有必要的类型及其参数,例如,使用一个基于字符串的抽象工厂,类型名称存储在输入文件中,然后由一个外部脚本更改,该脚本在一系列测试用例上执行客户端应用程序 当N个策略的组合最终成为N个不同的客户端应用程序时,如何使用策略实现这一点Templates 是否可以将基于策略的设计与自动化测试结合使用?,templates,optimization,automated-tests,generic-programming,Templates,Optimization,Automated Tests,Generic Programming,我正在开发一个数值模拟库,它围绕着由不同计算算法操作的单一数据集合。这些算法非常复杂,它们具有涉及多个参数的不同状态,并且可以互换(在某些语义限制下) 为了避免集合过于臃肿的接口并支持不同的实现等,我考虑使用基于策略的设计。这使集合在存储结构、算法、参数和内部内容之间有了广泛的选择组合 如果我想象我使用GN策略重新设计了我的通用/面向对象的现有设计,我如何选择最佳算法和数据结构?从概念上讲,我需要定义一组策略和一组验证测试用例,并执行参数研究 当使用面向对象编程时,这很容易,因为我可以在运行时确
如何以专业的方式将自动测试与基于策略的设计结合起来?如果您将算法表示为策略,那么您/应该/已经想到了一个非常统一的界面。您可以想象一个“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++中,它提供了一个关于策略驱动设计的伟大入门。就像你所暗示的,在运行时没有办法做到这一点!听起来您需要编写一个脚本来生成所有可能的策略排列,并以某种方式将其粘贴到性能测试代码中。我不知道有任何现成的工具可以做这种事情,但也许其他人会:)我正在考虑用一个外部脚本在协同编辑中编辑宏,该脚本将类型名称存储在表中并进行排列,然后调用编译器,然后再调用编译器,自动测试套件:在本例中,客户端应用程序始终具有相同的名称。但是我想知道在实践中使用了什么?谢谢,我得出了相同的结论:我将使用基于策略的设计并确定合理的测试配置。对于这些配置,我将让脚本配置模板,编译并执行测试集。感谢您对本书的提示,我已经读过了,但是关于基于策略的设计的章节没有解释自动测试。:)