前言
前一篇介紹了 RSpec Gem,這次換介紹 Cucumber 這個 Gem
後續的文章會以此 repo 作為範例
介紹
Q1. 心中或許會有疑問說,已經有 RSpec 為何還需要 Cucumber 增加測試的複雜度?
Cucumber 更像是讓人類看得懂的語言,來描述要測試的事情,且支援多種語系寫法,像是可以用中文寫測試,讓 PM 與客戶看得懂,也能成為將來驗收的依據
Q2. 可以只寫 Cucumber 不寫 RSpec 嗎?
小孩紙才做選擇,我全都要,這就要問施主你的選擇惹 XD
如何安裝
放在 :test
中,可參考此 commit
參考資料: Cucumber Installation,官方文件有提醒 Ruby on Rails 的安裝方式與 Ruby 安裝方式不同喔!!
1
2
3
4
5# Gemfile
gem 'cucumber-rails', require: false
gem 'database_cleaner'
# 記得要 bundle
上述 bundle
完成後,可輸入 rails g -h
會看到以下資訊
1
2
3
4# 也可輸入 rails g -h | grep -B 2 cucumber
Cucumber:
cucumber:install
接著再終端機輸入,可參考此 commit
1
2
3
4rails generate cucumber:install
# 也可縮寫成
rails g cucumber:install
寫個 Cucumber 中文測試範例
由於之前已經透過 scaffold
建立 User
以下示範寫個中文測試,可參考此 commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# features/user.feature
#language: zh-TW
@user
功能: 建立使用者
這是示範的範例
支援中英文寫法
場景: 能建立使用者
假如 一開始沒有使用者
假如 有一位使用者的姓名是"小菜"
而且 該使用者的信箱是"river@riverye.com"
而且 該使用者的電話與地址資訊如下:
|phone |address |
|0987654321 |台北市某處 |
當 使用者被建立時
那麼 使用者會有1位
而且 使用者的資訊會是正確的:
|name |email |phone |address |
|小菜 |river@riverye.com |0987654321 |台北市某處 |
空的測試 (先寫規格,還沒準備答案)
如何執行
終端機輸入
1
2
3
4
5
6
7
8
9
10
11
12# 跑全部檔案
cucumber
bundle exec cucumber
# 跑指定 tag
bundle exec cucumber -t @user
# 跑指定資料夾
bundle exec cucumber features
# 跑指定檔案
bundle exec cucumber features/user.feature
更多操作範例輸入
1
2
3
4
5
6
7
8
9cucumber -h
Usage: cucumber [options] [ [FILE|DIR|URL][:LINE[:LINE]*] ]+
Examples:
cucumber examples/i18n/en/features
cucumber @rerun.txt (See --format rerun)
cucumber examples/i18n/it/features/somma.feature:6:98:113
cucumber -s -i http://rubyurl.com/eeCl
準備的測試答案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38# features/step_definitions/user_step.rb
假如('一開始沒有使用者') do
expect(User.count).to eq(0)
end
假如('有一位使用者的姓名是{string}') do |name|
@user = {}
@user.merge!(name: name)
end
假如('該使用者的信箱是{string}') do |email|
@user.merge!(email: email)
end
假如('該使用者的電話與地址資訊如下:') do |table|
table.hashes.each do |hash|
phone = hash['phone']
address = hash['address']
@user.merge!(phone: phone, address: address)
end
end
當('使用者被建立時') do
@user = User.create(@user)
end
那麼('使用者會有{int}位') do |count|
expect(User.count).to eq(count)
end
假如('使用者的資訊會是正確的:') do |table|
table.hashes.each do |hash|
hash.each do |key, value|
expect(@user[key]).to eq(value)
end
end
end
執行結果
如何讓 CI 也能跑 Cucumber
將原本 CI 設定檔新增以下,可參考此 commit
1
bundle exec cucumber
官方網站
https://cucumber.io/docs/cucumber/
參考資料
小結
想不到測試可以寫中文吧 XD
有沒有覺得很親切? (噁心
瞬間人類都能看懂這份規格
且每一個測試都能重複使用
將來接手的工程師要改 code 時
也能看到原本的規格是如何制定
不用再通靈啦 (欣慰
鐵人賽文章連結:https://ithelp.ithome.com.tw/articles/10243344
medium 文章連結:https://link.medium.com/uP1cmw5R29
本文同步發布於 小菜的 Blog https://riverye.com/
備註:之後文章修改更新,以個人部落格為主