测试 关于测试, 有什么好的建议吗?

andrew_qx · 2011年11月23日 · 最后由 blackanger 回复于 2013年11月07日 · 5501 次阅读

关于如何写测试,用什么测试,一直很纠结,主要有以下两点

  1. 是 rspec 还是 test::unit 挺老的问题了。貌似分歧也挺大的,感觉 rspec 的很多 matcher 挺好用,但是 rails 自带的 test framework 貌似比较简单,DHH 坚决不放弃..

  2. 测试的度的问题,覆盖到什么程度比较好,模型视图集成测试统统要写还是只写一部分就够。另外有些程序 js 很多,是不是要专门为 js 也加上测试?感觉测试多了也挺难维护的。

不好意思,都是老问题了..但是就是很纠结。

我之前一直用的 rspec,昨天才看 Agile 里关于 testunit 的部分,发现 assert 来写也挺好的。 好像就是语法不太一样,测试的思路都一样,这个看个人喜好吧。。Rei 比较喜欢 testunit

js 测试的话可以用 capybara,rspec 里在 describe 后加:js => true,cucumber 在 Scenario 上加@javascript,testunit 好想也有办法。然后装个 capybara-webkit,就可以无头测试,或者用 selenium,会打开 ff 来测试。之前为 ruby-china写过一点可以看看。

第二个问题因为我没有项目经验,只有凭感觉说了,controller 和 model 都应该测,逻辑比较强容易出错。集成测试用 cucumber 写的话也不太麻烦,view 我还没测过,都是靠眼睛看。。集成测试的时候也会涵盖一部分 view 的测试吧,要是 view 没有 render 应该 render 出来的东西 cucumber 会哭的

#1 楼 @cqpx 不是很喜欢 cucumber 觉得无用信息太多

哈哈,你怎么和 Rei 一样。 可能因为我写单元测试还不熟,看到 cucumber 把火狐打开按照步骤操作一遍没问题才安心 纯 rspec 写测试推荐 githubhq 这个项目,把 controller 的测试都省了,https://github.com/gitlabhq/gitlabhq/tree/master/spec diaspora 这个项目的测试就更丰富了https://github.com/diaspora/diaspora/tree/master/spec

谢谢~ 我参考一下~

  1. test:units。rspec 属个人喜好问题,建议没有决定的时候先用 test:units,因为 test:units 没有任何问题,rails 团队在维护,我也不明白为什么会火一个做同样事情的 rspec。

  2. 我的测试量是 view << funciton < units,js 想测,写了一些 qunit,还没实践到项目中。总之视图测试是弱项,想听听别人经验。

项目都没写测试,只有 Gem 才写...哈哈哈

我们也基本上不写,只是有些关键逻辑写写单元测试;有些经常需要改进的功能写了测试后光维护测试都得耗费很大精力 不写测试不是说就不注重代码质量,代码质量的控制还是要的

当前学习进度还没到 rspec 这块,做的东西里一直没有测试覆盖。但是觉得非常必要。通过项目发现难免犯错,有测试会比较放心。

#7 楼 @fredwu 不错,我参考一下你的项目。另外问下你说 cucumber 被误用主要是指什么方面,我觉得 cucumber 作为 BDD 领域的应用应该不只是给开发人员用的吧?如果没种利益相关者参与,只有开发人员,貌似不是很有必要。

Cucumber 原本是写给产品人员看的,或是说,产品人员或测试人员可以写 Cucumber 用来制定程序的逻辑。

但是,产品和测试写出来的 Cucumber steps 都不是很 dry,非常难维护。即便是一些经验不多的开发人员,也写不好 Cucumber 的 steps。

用 Cucumber 做 acceptance tests 的用意是,features/scenarios 本身不应该包含任何 implementation 的逻辑——如果页面上的 UI 有更动,你应当修改 step definition,而非 features。

比方说,如果要测试用户登录。很多人会这么写:

Given I'm on the hompage
When I click the "login" link
Then I should see "User Login"
Then I fill in "username" with "test"
Then I fill in "password" with "test"
Then I click the "login" button
Then I should see "Welcome test! You're logged in."

类似这样的 feature 很难维护。如果登录的逻辑变动了,你需要修改很多地方。

比较正确的写法是——

Given I'm on the homepage
Then I should be able to sign in as user "test" with password "test"

然后把所有的登录逻辑放到第二行的 step definition 里。

#11 楼 @fredwu 还是不怎么明白把登录的逻辑移动到 step definition 里的用意。。 我现在测登录是用的这样的办法:

首先写一个 Scenario 来模拟用户登录的步骤,也就是阁下提到的“很多人的写法“: https://github.com/huacnlee/ruby-china/pull/9/files#L6R3 这个只用一个 Scenario

然后其他地方要用登录的话就把步骤写到 step definition 里: https://github.com/huacnlee/ruby-china/pull/9/files#L7R48

如果登录的逻辑改变了,就修改这两个地方。

请问在哪种情况下会修改其他很多地方呢?

我刚些 BDD 不久,用 cucumber 和 rspec 的时候界限有点模糊 比如这个测试: https://github.com/huacnlee/ruby-china/pull/9/files#L6R47 如果需要测@在末尾和不在末尾两种情况的话,一开始我是打算写在 cucumber 里面的,现在过了几个星期之后我又感觉这些应该在 rspec 里测。 那到底哪些才是 cucumber 应该测的哪些应该用 rspec 来测我还分得不清楚 要我完全放弃 cucumber 只用 rspec 又不太愿意。。我现在还不熟练,非要看它打开浏览器让我看看才放心。。

很同意 @fredwu 关于 Cucumber 的观点,我个人也不喜欢使用 Cucumber。

#12 楼 @cqpx

https://github.com/huacnlee/ruby-china/pull/9/files#L6R47 里:

这些登录步骤都是重复的——

And 点击"登录"
And 在"用户名"输入"sergey"
And 在"密码"输入"sergeywonttellyou"
And 点击"登陆"

这些都应该放在一个 step definition 里。


RSpec/Test::Unit/MiniTest用来测试程序的逻辑。

Cucumber用来模拟用户使用你的程序的流程。 

#11 楼 @fredwu 我选择这样写

test 'Given I'm on the homepage, Then I should be able to sign in as user "test" with password "test' do
  ...
end

hoshi 请教你一个问题。我在学习用你的方式去测试,然后就遇到了这样一个问题: 我现在在给 ruby-china 加一个功能嘛,就想测试一个按钮来提交数据,然后我就看你的代码是这么来写的

post :reply, :id => topic, :reply => {:body => 'content'}, :format => :js

如果我不知道那个表单会按照什么格式提交数据,我会去看 log,里面会显示提交数据的格式,然后照着写出这样的语句。

但是如果以后表单格式在我不知道的情况下变了,提交的东西不一样了,这个 test 和 controller 都还没有改,你会怎么预防这样问题呢@Rei

#11 楼 @fredwu

原谅我挖坟了... 很喜欢你的一个说法:

Cucumber是近年来被误用的最多的工具之一

我觉得在纯 Ruby 的领域,不涉及开发的话,Cucumber 单独也是一个不错的思维工具。

Cucumber 其实不光是给客户看的,其实写 Cucumber 的感觉,和我学习 Ruby 时不断的写笔记是有相似之处的。

#7 楼 @fredwu mocha 也不错

挖坟的来了。 这贴就冲着 @fredwu 的观点怎么着也得给个精华啊。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号