speclj 测试框架无法给出测试报告

28 views
Skip to first unread message

Mingli Yuan

unread,
Jan 5, 2015, 12:32:50 AM1/5/15
to cn-cl...@googlegroups.com
嗨,各位,

我们正在为一套服务系统开发集成测试程序,遇到一些问题,还请各位帮忙解答。

在后台线程中启动了服务之后,运行 lein spec,框架正常结束,但不论测试结果正确与否,都无法给出测试报告。不启动服务,运行 lein spec 结束后,会给出链接异常的测试报告,这符合预期。

所以,应该是后台线程的什么逻辑干扰了测试报告的生成。但我没查到确切原因。

除了这个问题,还想问问各位的实际工程体会:

(1)测试框架的选择 speclj、midj、clojure.test 等?
(2)在有复杂服务器逻辑的情况下,mock 是否真的好用?
(3)各种测试相关的经验或者吐槽。

明理

Mingli Yuan

unread,
Jan 5, 2015, 1:46:22 AM1/5/15
to cn-cl...@googlegroups.com
我换用了 Exceptations 框架,也是同样的问题。

这应该说明测试框架给出测试报告的机制大同小异。

Ruiyun Wen

unread,
Jan 5, 2015, 3:12:19 AM1/5/15
to cn-clojure
没用过speclj,胡乱吐槽一下:

我认为项目初期就编写太多的单测,会对系统演化造成障碍。每次想探索一下新的想法时,一堆不通过的单测让人极度闹心。是的,吐的就是TDD,我很好奇这种阻碍性的工程实践,是怎么应用到真实的项目中的。

至于mock,我更相信这货就是一个骗局,引人一步步螺旋式的深陷进去,等想拔出来时,才发现已经没时间好好写实际代码了。

在项目开始的混沌阶段,不要说接口,就连程序结构有可能都会经常性的大幅重构,所以我觉得这个阶段其实是不适于写正式的自动化单测的。但是在程序结构和接口都已经基本稳定,感觉心里有谱时,补充一些必要的大粒度测试,倒是会对将来的维护带来一些便利。可是这个度是很不容易把握的。

此外,测试代码也是代码,如何保证测试代码本身的质量,也是一件让人头疼的事情。

总之,我觉得clojure的体验式编程给自己带来的帮助,要远远胜过TDD。

--
中文社区博客:http://blog.clojure.cn/
中文问答网站:http://ask.clojure.cn/
中文邮件列表:https://groups.google.com/d/forum/cn-clojure?hl=zh-CN
---
您收到此邮件是因为您订阅了Google网上论坛上的“CN-Clojure”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到cn-clojure+...@googlegroups.com
要发帖到此群组,请发送电子邮件至cn-cl...@googlegroups.com
访问此群组:http://groups.google.com/group/cn-clojure
要查看更多选项,请访问https://groups.google.com/d/optout

Mingli Yuan

unread,
Jan 5, 2015, 3:36:38 AM1/5/15
to cn-cl...@googlegroups.com
谢谢回复。

我自己基本上也是类似的风格,先让系统自由演化,等到概念得到验证、接口趋于稳定的时候,再去大量的引入测试。

我原本也认为 Mock 有助于项目,但实践下来,感觉带来到麻烦也不小,特别是后台有数据服务和复杂逻辑的时候。但我不排除 Mock 的技巧在某些局部仍然适用。

 Migration、Fixture 这些由 RoR 带来的工程方法,我们用着感觉还不错。

我的理解中,系统的稳定演进还是需要有足够的测试来保证的。对 Java 一类的静态类型语言,编译器还可以通过类型机制帮着做演进的正确性校验。对 Clojure 来说,只能通过大量测试来补足了。



Mingli Yuan

unread,
Jan 6, 2015, 11:07:56 PM1/6/15
to cn-cl...@googlegroups.com
我最后写了一个 JUnit 把所有的 clojure test 包起来,然后用 IDE 的 JUnit 工具来测试,可以顺利看到报告。

原始问题解决了。

很多人都提到过善用 repl 来加速开发,但有没有人总结出来一套最佳实践呀?

短小独立的函数用 repl 很容易测,但依赖于其他服务的呢?对代码结构有什么要求?

总之,我觉得测试还是很重要, repl 需要总结一些技巧。

Lin Ju

unread,
Jan 7, 2015, 12:42:10 AM1/7/15
to cn-cl...@googlegroups.com
> 短小独立的函数用 repl 很容易测,但依赖于其他服务的呢?

1. 你的依赖可以作为一个参数注入, 这样该函数便不依赖该服务.
2. 你的依赖可以作为global binding, 测试或repl时可以替换它.

围着数据库打转的函数,  实打实配个测试数据库测试函数也是极好.


-- 
Lin Ju

Sent with Sparrow

Robert Luo

unread,
Jan 7, 2015, 7:47:47 PM1/7/15
to cn-cl...@googlegroups.com
不存在一个最好的工作方法。

TDD 对某些人例如我就是极为重要的生产力源泉,对于很多人可能就是毒药。例如,Rich Hickey 就不写 Unit Test,但很多其他优秀程序员例如 Stuart Sierra 没有 TDD 就活不下去。

抛砖引玉一下,本人的开发过程:

 1. 启动 IDEA Intellij, cursive 插件
 2. 打开 terminal tab, 运行 lein midje :autotest 自动运行所有测试。每个过程的开始都是绿色。
 3. 按下 Ctrl-R 启动 REPL,用于尝试
 4. 写一个单元测试,令其失败。对我来说,这就是设计过程。从思考到写测试的时间比较长。TDD 的最大优势不是在于质量保证,而是让你先从使用者的角度来思考设计。
 5. 开始实现代码,完成后按下 save all 按钮,terminal 里面的测试会自动重新运行。
 6. commit。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到cn-clojure+unsubscribe@googlegroups.com
Reply all
Reply to author
Forward
0 new messages