测试实践:programming-scala-book-code-examples 中 MUnit 与 ScalaCheck 属性测试示例

📅 2026/8/20 17:26:32
测试实践:programming-scala-book-code-examples 中 MUnit 与 ScalaCheck 属性测试示例
测试实践programming-scala-book-code-examples 中 MUnit 与 ScalaCheck 属性测试示例【免费下载链接】programming-scala-book-code-examplesThe code examples used in Programming Scala, 2nd and 3rd Editions (OReilly)项目地址: https://gitcode.com/gh_mirrors/pr/programming-scala-book-code-examplesprogramming-scala-book-code-examples 是 OReilly 经典书籍《Programming Scala》第 2 版与第 3 版的官方代码示例仓库涵盖从面向对象、函数式编程到类型系统、并发与 DSL 的数百个可运行示例。很多人不知道的是这个仓库还内置了一套完整、专业的测试实践基于 MUnit 的单元测试与基于 ScalaCheck 的属性测试Property-Based Testing相互配合堪称学习 Scala 测试的最佳活教材。本文带你快速看懂其中的 MUnit 与 ScalaCheck 属性测试示例并学会如何运行它们。属性测试 vs 单元测试两种互补的测试思路传统的单元测试如 MUnit 的FunSuite是给定输入断言输出而属性测试ScalaCheck则完全不同你只需描述代码必须永远成立的不变量框架会自动生成海量随机数据去验证它。仓库中两者都有精彩示范单元测试代表PersonSuite.scala 使用 MUnit 的FunSuite与test(...)逐一断言Person、Address的可选参数行为。属性测试代表src/test/scala下多个*PropertiesSuite.scala文件全部继承 MUnit 提供的ScalaCheckSuite把 ScalaCheck 无缝嵌入 MUnit 测试框架。测试依赖在 build.sbt 中一目了然munit、scalacheck与munit-scalacheck三个库版本分别为 1.3.4、1.19.0 和 1.3.0。从邮政编码开始MUnit 驱动 ScalaCheck 属性测试最直观的入门示例是src/test/scala/progscala3/basicoop/people/ZipCodePropertiesSuite.scala。被测对象ZipCode见src/main/scala/progscala3/basicoop/people/ZipCode.scala是一个构造器私有、只能通过伴生对象校验后创建的 case class其校验规则是邮编必须是 10000–99999 的五位数字扩展号必须是 0 或 1000–9999 的四位数字。测试代码的思路非常清晰用Gen.choose(10000, 99999)和Gen.choose(1000, 9999)组合出一个合法的随机数据生成器validInts用property(...)声明 7 条不变量例如整型邮编 扩展号创建成功且字段值保持不变每条不变量通过forAll(validInts) { ... }自动跑上百组随机数据。除此之外同目录下的ZipCodeProperties.scala还展示了纯 ScalaCheck 写法——直接继承Properties不依赖 MUnit适合对比两种风格的差异。用属性测试验证数学定律Functor 与 Monad属性测试最有说服力的应用场景是验证函数式编程的数学定律。在src/test/scala/progscala3/fp/categories/FunctorPropertiesSuite.scala中用forAll自动验证了 Functor 的三条核心定律同一律Identitymap(l)(id) l复合律Morphism Compositionmap(map(l)(f1))(f2) map(l)(f2 compose f1)结合律Associativity连续三次 map 与分组 map 结果一致而MonadPropertiesSuite.scala则验证了 Sequence Monad 的 unit 左单位律、右单位律与结合律。这类定律一旦用随机数据跑通比任何手写样例都有说服力也是学习 Category Theory 时最好的可视化验证工具。业务场景实战薪资计算器的属性测试属性测试并不只属于理论领域src/test/scala/progscala3/dsls/payroll/internal/DSLPropertiesSuite.scala给出了真实的业务示范针对内部 DSL 实现的薪资计算器用Gen.choose(30000.0, 200000.0)随机生成年薪验证双周毛薪 年薪 / 26以及扣除各项税费后的净薪公式。由于浮点计算存在精度误差测试还专门写了一个within容差函数——这是浮点属性测试的标准做法值得抄进自己的项目里。类似的还有toolslibs/ComplexPropertiesSuite.scala用随机复数验证加法、减法以及零元identity element的数学性质。零成本上手一条命令运行全部测试克隆仓库后你只需要安装 JDK 与 sbtgit clone https://gitcode.com/gh_mirrors/pr/programming-scala-book-code-examples cd programming-scala-book-code-examples sbt testsbt会自动下载 Scala 3 与全部测试依赖并运行所有单元测试与属性测试。几个实用命令sbt test编译并运行全部测试sbt testOnly progscala3.basicoop.people.ZipCodePropertiesSuite只跑指定套件sbt ~test监听文件变化保存即自动重跑非常适合 TDD 工作流。小结programming-scala-book-code-examples 的测试代码堪称麻雀虽小、五脏俱全既有 MUnit 的常规单元测试也有 ScalaCheck 驱动的属性测试既覆盖业务对象与薪资计算也覆盖 Functor、Monad 等抽象定律。对于想进阶 Scala 测试技巧的新手而言直接阅读src/test/scala/progscala3下的这些示例是比任何教程都更接地气的学习路径。从模仿ZipCodePropertiesSuite的forAll写法开始你很快就能在自己的项目里用属性测试抓住那些手工用例永远测不到的边界 Bug。【免费下载链接】programming-scala-book-code-examplesThe code examples used in Programming Scala, 2nd and 3rd Editions (OReilly)项目地址: https://gitcode.com/gh_mirrors/pr/programming-scala-book-code-examples创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考