你必須很努力

Day20 - Ruby on Rails 測試篇 - Cucumber (內文有範例教如何寫中文測試)

2020/09/25
字數統計: 923閱讀時間: 3 min

前言

前一篇介紹了 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
4
rails 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
9
cucumber -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/

參考資料

Cucumber 小黃瓜驗收測試工具 - ihower


小結

想不到測試可以寫中文吧 XD
有沒有覺得很親切? (噁心
瞬間人類都能看懂這份規格
且每一個測試都能重複使用
將來接手的工程師要改 code 時
也能看到原本的規格是如何制定
不用再通靈啦 (欣慰


鐵人賽文章連結:https://ithelp.ithome.com.tw/articles/10243344
medium 文章連結:https://link.medium.com/uP1cmw5R29
本文同步發布於 小菜的 Blog https://riverye.com/

備註:之後文章修改更新,以個人部落格為主

CATALOG
  1. 1. 前言
  2. 2. 介紹
    1. 2.0.1. Q1. 心中或許會有疑問說,已經有 RSpec 為何還需要 Cucumber 增加測試的複雜度?
    2. 2.0.2. Q2. 可以只寫 Cucumber 不寫 RSpec 嗎?
  • 3. 如何安裝
  • 4. 寫個 Cucumber 中文測試範例
    1. 4.0.1. 空的測試 (先寫規格,還沒準備答案)
  • 5. 如何執行
    1. 5.0.1. 準備的測試答案
    2. 5.0.2. 執行結果
  • 6. 如何讓 CI 也能跑 Cucumber
  • 7. 官方網站
  • 8. 參考資料
  • 9. 小結