testing

8 posts

Symbolic Execution 发现了我 94% 测试覆盖率都遗漏的整数溢出

你的单元测试只检查特定输入,而 symbolic execution 检查所有可能的输入。以下是它的工作原理、成本以及从何入手。

你的测试套件有 94% 的覆盖率,零失败。一个 symbolic execution 引擎在三秒内就在你的代码中找到了一个崩溃。 测试没有坏。覆盖率指标没有说谎。问题在于测试只验证特定点上的行为。Symbolic execution 验证的是整个输入区域上的行为。无论你写多少示例,如果 bug…

Metamorphic testing 发现了 147 个编译器 bug 和一个自动驾驶汽车缺陷。它是这样工作的。

Metamorphic testing 在 GCC、LLVM、Vulkan shader 编译器和 ADAS 模拟器中发现了真实 bug。本文用可运行的代码解释这项技术,并说明它在你 test suite 中的定位。

Metamorphic testing 在 GCC 和 LLVM 中发现了 147 个已确认的 bug,在汽车 OEM 使用的商用 ADAS 模拟器中发现了缺陷,并在一辆自动驾驶汽车撞死行人前八天,在其感知系统中发现了一个致命缺陷。这项技术听起来很学术,但这些 bug 并非理论虚构。 问题在于 oracle…

大多数 Metamorphic Relations 都是摆设。以下是如何挑出真正有用的。

并非所有 metamorphic relations 都能捕获 bug。弱关系给你虚假信心,强关系才能发现真正的缺陷。以下是如何区分两者,并构建一组真正有效的关系。

你为定价引擎写了十二条 metamorphic relations。每个测试都通过了,你对自己的覆盖率感觉良好。 然后有客户报告批量折扣算反了。你检查自己的关系套件,没有一个测试失败。你有加法一致性、单调性和幂等性的关系,却没有一个能捕获折扣乘数中的符号错误。 这是 metamorphic testing…

正确答案未知时,我该如何测试代码?

Metamorphic testing 让你无需知道确切的预期输出就能验证代码正确性。本文介绍它的工作原理、局限性以及如何开始使用。

你发布了一个为支持工单打标签的机器学习模型。测试套件全绿,每个测试都通过了。 但这些测试没有一个真正检查标签是否正确。你不知道正确答案是什么,也没人知道。对于真实世界的输入,"正确"输出实际上是不可知的,于是你只能退而求其次,检查函数没有崩溃,或者输出形状符合预期。这不是测试,这是碰运气。 这就是 oracle…

我把测试、代码和散文都放在一个 Markdown 文件里,再也不用往文档里复制代码了

Literate programming 将 Markdown 文件作为单一事实来源,使文档、测试和实现保持同步。以下是如何用三十行 Python 实现它。

你的文档、测试和代码是三份文件,讲着同一个故事,却讲得都很糟糕。 你在源码里更新了函数签名,忘了改 README 里的示例。一周后,新员工把过时的代码片段复制到了生产环境。你的测试文件仍然把旧的行为编码为预期结果。现在你有两个 bug 和一个文档工单。…

干等 race condition 是最烂的测试策略

model checking 如何在数秒内碾压你在生产环境跑几天才能发现 concurrency bug 的做法,以及如何把它用在自己的代码上。

在生产环境里等 race condition 冒出来,那不叫测试。那叫披着勤奋外衣的侥幸。 你可以把应用跑上几周,盯着 metrics dashboard,最后照样发布一个 concurrency bug——它只会在两个 request 刚好打进同一个 cache eviction window…

单元测试全绿,但你的数据照样消失

Mock 数据库测试验证的是 SQL 语法,而不是数据行能否在崩溃、并发写入或 schema 不匹配时存活。下面介绍如何真实地测试持久化。

如果你在测试中 Mock 数据库,你实际上只是在验证仓库层调用了正确的方法。你并没有测试数据能否在崩溃后存活、唯一约束是否真的会阻止重复数据、或者事务失败时是否会回滚。 这个区别很重要。Mock 的 返回你预设的值。真实的…

不被 mock action 淹没地测试 Redux

为每个 Redux action 写 mock 会让你的测试变成 changelog 校验器。下面介绍如何用真实的状态流转来测试 store。

如果你写过这样的测试:验证 被调用时传入的 payload 结构完全匹配,那么你的测试会在每次有人重命名常量时崩溃。 这不是在测试你的状态逻辑,而是在测试你的手指有没有敲对字符串。 Redux 测试教程通常以 Jest mock 开头:spy ,断言 action creator 被调用了,断言 type…