首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

Kent Beck:可组合测试

摘要

The Test Desiderata desires 12 properties for tests, two of which are: No, and here’s why (I finally got an example—examples are always the hardest part.) If a test runs by first setting up its own te...

the test tests object that have test1 same actual test2
2026-08-18 1 阅读 约6分钟阅读 vinipolicena
分享:
字号:
测试需求需要 12 个测试属性,其中两个是: 否,原因如下(我终于得到了一个示例 - 示例始终是最难的部分。)如果测试通过首先设置自己的测试装置、从头开始创建将用作输入的所有数据来运行,则可以保证该测试是隔离的。无论您运行测试的顺序如何,结果都将完全相同。 (这与函数式编程中的引用透明性具有相同的属性。)在 xUnit 测试框架(至少是大多数框架)中,通过为每个测试创建一个新的测试对象实例并在运行测试之前运行 setUp() 函数来鼓励隔离。 (某些框架,特别是 NUnit,会重用测试实例,从而打开打破隔离的大门。)假设我们有一套独立的测试,并且我们将它们全部运行在一起。该套件的成功应该给我们信心(用 Desiderata 的术语来说是有预测性的),尽管每个单独的测试本身并不全面。示例——假设我们有一个测试: test1() object := newWhatever()actual := object.doSomething()assertEquals(expected,actual) 我们得到了它的工作,所以我们想要实现下一个功能。我们复制、粘贴和扩展: test2() object := newWhatever()actual := object.doSomething()assertEquals(expected,actual)actual2:=object.nowSomethingElse()assertEquals(expected2,actual2) 我见过这样的测试,已经被复制、粘贴和扩展了 6 到 7 次。最后一个测试很难阅读。请注意,如果 test1 失败,则 test2 也无法通过。 test1 捕获的所有不合规程序也将被 test2 捕获。我们至少有 3 个选项可以保持相同的覆盖范围、相同的可预测性:保留两个测试。删除测试1。简化测试2。从纯粹美学的角度来看(并且不要忽视美学),保留这两个测试会冒犯我的情感。他们是多余的!一定是出了什么问题。删除 test1 会让我们失去测试需求的另一个属性——测试应该是具体的。这就是测试的特性,当测试失败时,你可以确切地知道问题出在哪里。这就引出了我首选的解决方案——组合。我修剪 test2 以避免纯粹冗余的部分: test2() object := newWhatever() object.doSomething()actual := object.nowSomethingElse()assertEquals(expected,actual) test1 + test2 的组合没有丢失任何预测属性。它没有失去任何特定的财产。事实上,组合可能更具体,因为 test1 可能会失败而 test2 可能会通过(尽管它们可能因共同原因而失败)。假设我们有 4 种计算兴趣的方式和 5 种报告兴趣的方式。测试此问题的强力方法是 20 次测试。不过,使用组合,我们可以通过 10 次测试对我们的系统达到相同的置信度。如果从函数式编程的意义上来说,计算兴趣的变体与报告的变体是分开的,那么我们需要:从组合测试中获得信心需要一些思考,一些推理,一些设计(使正交维度明显正交),但是编写测试的投资在测试中得到了回报:当我解释了可组合测试的含义时,我经常收到经验丰富的测试开发人员的震惊反应。 “我永远不会减少测试中的断言。”在我看来,这是基于恐惧的反应,而不是原则上的反应。我们非常努力地编写测试。我们不能让他们变得更糟。组合不会让测试变得更糟。组合将测试视为一个整体,试图根据测试的几个有价值的属性来判断,使整体变得更好。使用 CodeRabbit(专为工程师构建的最先进的 AI 代码审查工具)提高团队的代码质量和交付速度。 CodeRabbit 提供上下文感知、逐行审查、即时一键修复和简洁的 PR 摘要,直接集成到您的 GitHub 工作流程中,让您花更少的时间进行差异分析,将更多的时间用于构建。​CodeRabbit 提供人工智能驱动的审查,适应您团队的标准、强制执行风格、发现错误和边缘情况,并自动映射代码依赖关系。​凭借多语言支持以及 40 多种 linter 和静态分析工具,它可以让您的代码保持干净、安全和可靠可维护 - 无论您的堆栈有多复杂。真实的例子显示了巨大的影响:只需将 CodeRabbit 添加到所有部署,SalesRabbit 就可以将错误减少 30%,并将工程速度提高 25%。CodeRabbit 专为帮助初级和经验丰富的开发人员而设计,它可以捕获甚至经验丰富的审阅者可能错过的问题,其内置文档和报告可以让每个人都了解情况并保持一致。免费试用 14 天加入数千名开发人员的行列,将代码审阅时间减半,并与其他开发人员保持一致。 CodeRabbit 的缺陷率。开始 14 天免费试用,体验无缝的 AI 审查、可操作的反馈和轻松的代码库学习。准备好优化您的工程工作流程了吗? (CodeRabbit 对于公共存储库是免费的,
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱