如何决定为基于规则的系统创建哪些单元测试
Posted
技术标签:
【中文标题】如何决定为基于规则的系统创建哪些单元测试【英文标题】:How to decide on what unit tests to create for a rules-based system 【发布时间】:2013-08-28 09:22:42 【问题描述】:我已经阅读了很多关于单元测试的内容,并且我强烈考虑首次将它与 C++ 和 TDD 一起使用。我遇到的问题是,在我在创建测试时看到的所有示例中,当我考虑如何开始为我即将开发的项目编写测试时,它们显得太琐碎了。可能是我错过了单元测试的要点,所以如果是这种情况,请告诉我。
一个函数很容易理解,例如检查素数。它有一个简单的输入(要测试的数字)和一个简单的输出(真或假)。在这里很容易理解和创建单元测试。
现在,让我们以一个防火墙应用程序为例,它有一个规则配置文件和一个评估引擎,用于按特定顺序评估这些规则,用于特定输入;网络数据包的详细信息,例如 IP、子网、端口、域等。
如果不编写单元测试,我会考虑先编写一个解析器来将规则配置文件解析为类,然后编写一个规则引擎来将给定的网络数据包与这些类中的规则进行比较,按顺序逐步执行规则它们被解析直到找到匹配项。
单元测试和 TDD 规定,在编写代码之前,应首先编写失败的测试。因此,在防火墙项目的情况下,您是从编写测试开始,通过创建一个模拟文件来提供一组特定的规则来检查文件的解析,还是这只是测试文件的读取,这通常不是推荐用于单元测试,而不是集成测试?如果要在这里做测试,应该测试什么?
另外,如何考虑为这样的规则引擎编写测试来评估规则?如果输入网络数据包的详细信息,则输出将是数据包是否被接受、拒绝或忽略。这样的测试几乎与规则引擎所做的相同,那么如何将其分解为小的“单元”测试呢?
【问题讨论】:
【参考方案1】:您需要对解析器进行测试。对于给定的输入字符串,确保出现正确的规则对象。这不会访问文件,因为您的解析器不应该与文件 I/O 紧密耦合。
您需要对每条规则进行测试。确保规则为给定的数据包提供了您想要的结果。这可能是最重要的部分;一定要彻底测试边缘情况。您不希望这些规则中的任何一个行为不端,因为它们会被恶意输入轰炸。
您需要对规则系统进行测试。编写简单的测试规则并使用它们来确保规则系统正确分派数据包并根据响应进行操作。
所有这些都可以在实际代码之前轻松编写。
【讨论】:
如果配置文件是 XML,那么你的意思是我应该向解析器提供 XML 片段作为输入,并使用类对象作为输出进行测试?另外,“每个规则都需要测试”,如果单个规则有 10 个属性,并且几乎是无穷无尽的规则组合,我该如何为每个规则创建一个测试?它可能只是一个更改的端口号,或者一个 IP 可能是一个 IP 范围,或者是一个通配符。可以使用任何性质的组合。那是成千上万种可能性。 单元测试的艺术是找到一组有代表性的输入。代码覆盖工具帮助。以上是关于如何决定为基于规则的系统创建哪些单元测试的主要内容,如果未能解决你的问题,请参考以下文章