【发布时间】:2010-10-25 18:16:34
【问题描述】:
给定软件...
- 系统由几个子系统组成
- 每个子系统都由几个组件组成
- 每个组件都使用许多类实现
...我喜欢为每个子系统或组件编写自动化测试。
我不会为组件的每个内部类编写测试(除非每个类都有助于组件的公共功能,因此可以通过组件的公共 API 从外部进行测试/测试)。
当我重构组件的实现时(我经常这样做,作为添加新功能的一部分),因此我不需要更改任何现有的自动化测试:因为测试仅依赖于组件的公共 API,并且公共 API 通常是在扩展而不是更改。
我认为此政策与 Refactoring Test Code 之类的文件形成鲜明对比,其中包含...
- “...单元测试...”
- "...系统中每个类的测试类..."
- “...测试代码/生产代码比率...理想情况下被认为接近 1:1 ...”
...我认为我不同意所有这些(或至少不实践)。
我的问题是,如果您不同意我的政策,您能解释一下原因吗?这种程度的测试在什么场景下不够用?
总结:
- 公共接口经过测试(并重新测试),很少更改(添加但很少更改)
- 内部 API 隐藏在公共 API 之后,无需重写测试公共 API 的测试用例即可更改
脚注:我的一些“测试用例”实际上是作为数据实现的。例如,UI 的测试用例由包含各种用户输入和相应的预期系统输出的数据文件组成。测试系统意味着测试代码读取每个数据文件,将输入重放到系统中,并断言它得到了相应的预期输出。
虽然我很少需要更改测试代码(因为通常会添加而不是更改公共 API),但我确实发现有时(例如每周两次)需要更改一些现有的数据文件。当我更好地更改系统输出(即新功能改进现有输出)时,可能会发生这种情况,这可能会导致现有测试“失败”(因为测试代码仅尝试断言输出未更改)。为了处理这些情况,我执行以下操作:
- 重新运行自动化测试套件,它有一个特殊的运行时标志,告诉它不要断言输出,而是将新输出捕获到新目录中
- 使用可视化差异工具查看哪些输出数据文件(即哪些测试用例)已更改,并验证这些更改是否良好且符合新功能的预期
- 通过将新输出文件从新目录复制到运行测试用例的目录来更新现有测试(覆盖旧测试)
脚注:“组件”是指“一个 DLL”或“一个程序集”之类的东西……大到足以在系统的体系结构或部署图上可见的东西,通常使用几十个或 100 个来实现类,以及仅由大约 1 个或少数几个接口组成的公共 API ......可能分配给一个开发人员团队的东西(其中不同的组件被分配给不同的团队),因此将根据Conway's Law 拥有相对稳定的公共 API。
脚注:文章 Object-Oriented Testing: Myth and Reality 说,
误区:黑盒测试就足够了。 如果你认真做好测试用例 使用类接口设计或 规范,你可以放心 课程得到充分锻炼。 白盒测试(查看 设计方法的实现 测试)违反了非常概念 封装。
现实:OO 结构很重要,部分 II. 许多研究表明, 黑盒测试套件被认为是 开发人员非常彻底 只锻炼三分之一到一半 的语句(更不用说路径或 州)在实施下 测试。有三个原因 这。首先,输入或状态 选择 通常 锻炼 正常 路径,但不要强迫所有可能的 路径/状态。二、黑匣子 单靠测试无法揭示惊喜。 假设我们已经测试了所有 系统的指定行为 正在测试中。有信心有 没有我们需要的未指定行为 知道系统的任何部分是否有 未被黑匣子行使 测试套件。这是唯一的办法 可以通过代码获取信息 仪器仪表。三、经常 难以行使例外和 未经检查的错误处理 源代码。
我应该补充一点,我正在进行白盒功能测试:我查看代码(在实现中)并编写功能测试(驱动公共 API)来测试各种代码分支(功能实现的详细信息)。
【问题讨论】:
-
这开始看起来像 stackoverflow.com/questions/182325/… 的副本——请查看该问题是否解决了您的问题。
-
@darch 如果不是重复的话,它肯定很接近;感谢您指出。该主题中接受的答案是单元测试的一个好处是它们是可重复/自动化的:在我的例子中,我已经自动化了我的功能测试,以便它们是可重复的。
标签: unit-testing refactoring automated-tests integration-testing code-coverage