关于如何写测试,用什么测试,一直很纠结,主要有以下两点
是 rspec 还是 test::unit 挺老的问题了。貌似分歧也挺大的,感觉 rspec 的很多 matcher 挺好用,但是 rails 自带的 test framework 貌似比较简单,DHH 坚决不放弃..
测试的度的问题,覆盖到什么程度比较好,模型视图集成测试统统要写还是只写一部分就够。另外有些程序 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 会哭的
哈哈,你怎么和 Rei 一样。 可能因为我写单元测试还不熟,看到 cucumber 把火狐打开按照步骤操作一遍没问题才安心 纯 rspec 写测试推荐 githubhq 这个项目,把 controller 的测试都省了,https://github.com/gitlabhq/gitlabhq/tree/master/spec diaspora 这个项目的测试就更丰富了https://github.com/diaspora/diaspora/tree/master/spec
test:units。rspec 属个人喜好问题,建议没有决定的时候先用 test:units,因为 test:units 没有任何问题,rails 团队在维护,我也不明白为什么会火一个做同样事情的 rspec。
我的测试量是 view << funciton < units,js 想测,写了一些 qunit,还没实践到项目中。总之视图测试是弱项,想听听别人经验。
个人观点:
你可以看看我的这个项目的测试—— https://github.com/fredwu/angel_nest
我们也基本上不写,只是有些关键逻辑写写单元测试;有些经常需要改进的功能写了测试后光维护测试都得耗费很大精力 不写测试不是说就不注重代码质量,代码质量的控制还是要的
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 又不太愿意。。我现在还不熟练,非要看它打开浏览器让我看看才放心。。
在 https://github.com/huacnlee/ruby-china/pull/9/files#L6R47 里:
这些登录步骤都是重复的——
And 点击"登录"
And 在"用户名"输入"sergey"
And 在"密码"输入"sergeywonttellyou"
And 点击"登陆"
这些都应该放在一个 step definition 里。
RSpec/Test::Unit/MiniTest用来测试程序的逻辑。
Cucumber用来模拟用户使用你的程序的流程。
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
原谅我挖坟了... 很喜欢你的一个说法:
Cucumber是近年来被误用的最多的工具之一
我觉得在纯 Ruby 的领域,不涉及开发的话,Cucumber 单独也是一个不错的思维工具。
Cucumber 其实不光是给客户看的,其实写 Cucumber 的感觉,和我学习 Ruby 时不断的写笔记是有相似之处的。