ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Clojure测试最佳实践:用programming-clojure学会Cucumber风格测试与expectorate快照

Clojure测试最佳实践:用programming-clojure学会Cucumber风格测试与expectorate快照 Clojure测试最佳实践用programming-clojure学会Cucumber风格测试与expectorate快照【免费下载链接】programming-clojureSample code for the book项目地址: https://gitcode.com/gh_mirrors/pr/programming-clojureprogramming-clojure 是《Programming Clojure》一书的官方示例代码库内含一套可运行的 Clojure 测试示例。本文带你用这个真实项目学会 Clojure 测试最佳实践clojure.test 的 Cucumber 风格行为驱动测试写法、are数据表测试以及 expectorate 快照式校验帮你写出既简洁又可读的高质量测试。 项目里的测试都放在哪打开仓库后所有测试集中在test/目录与src/中的实现一一对应内容路径测试目录20 个测试文件test/examples/test/被测试的示例代码src/examples/项目依赖配置project.clj测试用数据文件data/sequences/compositions.xml一个关键细节project.clj 中声明了org.clojure/test.generative依赖说明本书的测试体系覆盖了 clojure.test 与属性式测试两层这正是 Clojure 测试栈的标准配置。 实践一像写 Cucumber 一样命名测试Cucumber 的核心思想是测试名即需求。Clojure 的clojure.test虽然不强制语法但本项目全程采用描述行为的名词短语命名让测试名读起来就是一句验收标准。看 test/examples/test/fail.clj(deftest test-that-demonstrates-failure (is ( 5 ( 2 2)))) (deftest test-that-demonstrates-error-message (is ( 3 Math/PI) PI is an integer!?))两个值得偷师的细节测试名描述行为而非实现——test-that-demonstrates-error-message直接说明该测试验证的是错误信息会显示这件事。is的第二个参数是自定义失败信息断言失败时输出PI is an integer!?排错时一目了然。这是新手最常忽略的参数。更完整的例子见 test/examples/test/snake.clj一个贪吃蛇小游戏的测试test-move、test-turn、test-win、test-lose、test-eats每个测试名都对应一条游戏规则相当于把 Cucumber 的 Given/When/Then 场景压缩进了测试名里。 实践二用 are 宏做数据表测试Cucumber 的 Scenarios Outline 本质是数据表。Clojure 的等价武器是are宏——一次声明多组输入→期望避免复制粘贴 N 个断言。test/examples/test/sequences.clj 中的用法(are [x y] ( x y) (non-svn? .svn) false (clojure-source? foo.clj) true (clojure-source? foo.java) false)同一文件里的test-sets、test-joins也用are校验了集合运算和连接查询的结果。记住口诀单值断言用is成批等价断言换are。 实践三expectorate 快照式校验当函数输出很长一整份 XML、一段报表时把它写进断言既难看又难维护。本书给出的技巧是expectorate吐出来把实际输出写到文件与期望文件对比这就是轻量版快照测试。核心实现只有 5 行见 src/examples/expectorate.clj(defn expectorate [dst content] (with-open [writer ...] (.write writer (str content))))项目里共有三处版本可对照学习src/examples/expectorate.clj——基础版用with-open管理资源src/examples/io.clj——I/O 章节的演进版src/examples/protocols.clj——结合协议protocol的复用版它解决的典型场景解析 XML、生成构建报告这类输出即结果的功能断言输出文件等于预期比在代码里内嵌一大段字符串清爽得多。 实践四用 with-out-str 捕获程序输出有些程序把结果打印到 stdout 而不是返回值怎么断言test/examples/test/tasklist.clj 给出标准答案(is ( [init compile-java compile-clojure clojure jar all clean]\n (with-out-str (examples.tasklist/-main data/snippets/example-build.xml))))with-out-str把-main期间的所有标准输出收集成字符串参与比较被测试的实现见 src/examples/tasklist.clj。这是测试打印型命令的通用手法。 一键运行全部测试项目基于 Leiningen 构建克隆仓库后执行git clone https://gitcode.com/gh_mirrors/pr/programming-clojure cd programming-clojure lein deps lein testlein test会自动扫描test/下所有命名空间并运行全部deftest无需额外配置。✅ 新手速查清单测试名写成行为描述失败时能直接读懂哪条需求挂了参考 fail.clj给is带上自定义错误信息把断言失败变成人话成批等价断言一律用are数据表向 Cucumber 的 Scenarios Outline 看齐大段输出不要内嵌断言用 expectorate 写文件做快照对比打印型程序用with-out-str捕获输出再断言测试数据如 data/sequences/compositions.xml随仓库提交保证测试可重复照着test/examples/test/里这 20 多个测试文件读一遍你就拿到了 Clojure 测试的一份活教材。【免费下载链接】programming-clojureSample code for the book项目地址: https://gitcode.com/gh_mirrors/pr/programming-clojure创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表