本文是作者學(xué)習(xí)筆記裂垦,每一步均有截圖恢恼,想要學(xué)習(xí)Cucumber自動(dòng)化測(cè)試的同學(xué)可以試著一步一步來操作扼褪。
一、創(chuàng)建Project——HelloCucumber
在終端中輸入以下命令:
mvn archetype:generate \
"-DarchetypeGroupId=io.cucumber" \
"-DarchetypeArtifactId=cucumber-archetype" \
"-DarchetypeVersion=5.6.0" \
"-DgroupId=hellocucumber" \
"-DartifactId=hellocucumber" \
"-Dpackage=hellocucumber" \
"-Dversion=1.0.0-SNAPSHOT" \
"-DinteractiveMode=false"
也可使用http://www.reibang.com/p/60122d38a08a中所述:
mvn archetype:generate \
-DarchetypeGroupId=io.cucumber \
-DarchetypeArtifactId=cucumber-archetype \
-DarchetypeVersion=2.3.1.2 \
-DgroupId=hellocucumber \
-DartifactId=hellocucumber \
-Dpackage=hellocucumber \
-Dversion=1.0.0-SNAPSHOT \
-DinteractiveMode=false
然后系統(tǒng)開始自動(dòng)生成一個(gè)包名為hellocucumber的project
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------< org.apache.maven:standalone-pom >-------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.1.2:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.1.2:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- maven-archetype-plugin:3.1.2:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
等一段時(shí)間后呀舔,可以看到以下輸出:
[INFO] Archetype repository not defined. Using the one from [io.cucumber:cucumber-archetype:6.0.0-RC2] found in catalog remote
Downloading from central: https://repo.maven.apache.org/maven2/io/cucumber/cucumber-archetype/2.3.1.2/cucumber-archetype-2.3.1.2.pom
Downloaded from central: https://repo.maven.apache.org/maven2/io/cucumber/cucumber-archetype/2.3.1.2/cucumber-archetype-2.3.1.2.pom (13 kB at 18 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/io/cucumber/cucumber-archetype/2.3.1.2/cucumber-archetype-2.3.1.2.jar
Downloaded from central: https://repo.maven.apache.org/maven2/io/cucumber/cucumber-archetype/2.3.1.2/cucumber-archetype-2.3.1.2.jar (2.0 kB at 2.7 kB/s)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: cucumber-archetype:2.3.1.2
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: hellocucumber
[INFO] Parameter: artifactId, Value: hellocucumber
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: package, Value: hellocucumber
[INFO] Parameter: packageInPathFormat, Value: hellocucumber
[INFO] Parameter: package, Value: hellocucumber
[INFO] Parameter: version, Value: 1.0.0-SNAPSHOT
[INFO] Parameter: groupId, Value: hellocucumber
[INFO] Parameter: artifactId, Value: hellocucumber
[INFO] Project created from Archetype in dir: /Users/feng.li1/hellocucumber
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:41 min
[INFO] Finished at: 2020-05-19T12:03:01+08:00
[INFO] ------------------------------------------------------------------------
此刻弥虐,project就創(chuàng)建好了,我們可以ls看一下:
二媚赖、使用IDEA打開Project并運(yùn)行
然后使用IDE打開我們建好的這個(gè)project霜瘪,我使用的是IDEA
在下面terminal中使用命令:
mvn test
可以看到開始下載依賴,然后執(zhí)行測(cè)試惧磺,最后出現(xiàn)BUILD SUCCESS
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running hellocucumber.RunCucumberTest
No features found at [classpath:hellocucumber]
0 Scenarios
0 Steps
0m0.001s
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.163 sec
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.090 s
[INFO] Finished at: 2020-05-19T12:19:50+08:00
[INFO] ------------------------------------------------------------------------
查看project目錄可以知道颖对,當(dāng)前這個(gè)project沒有任何代碼或測(cè)試,所以執(zhí)行測(cè)試的結(jié)果是
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
三磨隘、添加一個(gè)Scenario
首先我們需要添加一個(gè).feature文件缤底,即一個(gè)測(cè)試場(chǎng)景描述。
在src/test/resources/hellocucumber上右鍵單擊琳拭,選擇newfile:
然后輸入is_it_friday_yet.feature训堆,新建文件描验,在文件中輸入以下內(nèi)容:
Feature: Is it Friday yet?
Everybody wants to know when it's Friday
Scenario: Sunday isn't Friday
Given today is Sunday
When I ask whether it's Friday yet
Then I should be told "Nope"
以上內(nèi)容中白嘁,F(xiàn)eature后面的是這個(gè)feature的名稱,下面第二行是解釋說明膘流。Scenario后面是這個(gè)任務(wù)場(chǎng)景的名稱絮缅,下面使用Given-When-Then這種BDD的方式,說明執(zhí)行這個(gè)任務(wù)的前置條件和結(jié)果斷言呼股,Cucumber將執(zhí)行這三段操作耕魄。
目前我們添加了scenario,還需要為這個(gè)scenario添加執(zhí)行代碼彭谁。
四:添加測(cè)試代碼
然后我們現(xiàn)在加入測(cè)試代碼
在test/java/helloCucumber目錄下的Stepdefs文件中加入如下代碼:
class IsItFriday {
static String isItFriday(String today) {
return null;
}
}
public class Stepdefs {
public String today;
public String actualAnswer;
@Given("^today is Sunday$")
public void today_is_Sunday() throws Exception {
today="Sunday";
}
@When("^I ask whether it's Friday yet$")
public void i_ask_whether_it_s_Friday_yet() throws Exception {
actualAnswer = IsItFriday.isItFriday(today);
}
@Then("^I should be told \"([^\"]*)\"$")
public void i_should_be_told(String expectedAnswer) throws Exception {
assertEquals(expectedAnswer, actualAnswer);
}
}
以上代碼是將today設(shè)置為Sunday吸奴,然后執(zhí)行詢問today是Friday,前文在feature中我們?cè)O(shè)置的正確答案是Nope缠局,但此刻我們將答案設(shè)置成了null
所以此刻我們r(jià)un一遍測(cè)試则奥,得到的結(jié)果應(yīng)該是不通過。我們?cè)倥芤槐閙vn test
結(jié)果如下:
Running hellocucumber.RunCucumberTest
Feature: Is it Friday yet?
Everybody wants to know when it's Friday
Scenario: Sunday isn't Friday # hellocucumber/is_it_friday_yet.feature:4
Given today is Sunday # Stepdefs.today_is_Sunday()
When I ask whether it's Friday yet # Stepdefs.i_ask_whether_it_s_Friday_yet()
Then I should be told "Nope" # Stepdefs.i_should_be_told(String)
java.lang.AssertionError: expected:<Nope> but was:<null>
Results :
Failed tests: Sunday isn't Friday(Is it Friday yet?): expected:<Nope> but was:<null>
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
可以看到狭园,運(yùn)行結(jié)果很清晰地提示我們读处,我們想要的結(jié)果是Nope,但是實(shí)際結(jié)果是null唱矛,所以測(cè)試不通過罚舱。
然后我們將Stepdefs文件中的IsItFriday這個(gè)class中井辜,return null改為return “Nope”
class IsItFriday {
static String isItFriday(String today) {
return "Nope";
}
}
然后重新運(yùn)行mvn test,可以看到管闷,此刻結(jié)果為通過粥脚,
1 Scenarios (1 passed)
3 Steps (3 passed)
0m0.081s
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.26 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.557 s
[INFO] Finished at: 2020-05-19T14:47:50+08:00
[INFO] ------------------------------------------------------------------------
至此,我們的第一個(gè)scenario成功創(chuàng)建并運(yùn)行渐北。
五阿逃、添加scenario
在上面的feature文件中,再添加一個(gè)scenario
Scenario: Friday is Friday
Given today is Friday
When I ask whether it's Friday yet
Then I should be told "TGIF"
然后在Stepdefs中再添加一個(gè)Given:
@Given("^today is Friday$")
public void today_is_Friday() {
this.today = "Friday";
}
此時(shí)運(yùn)行mvn test赃蛛,得到的結(jié)果是:
Failed scenarios:
hellocucumber/is_it_friday_yet.feature:9 # Friday is Friday
2 Scenarios (1 failed, 1 passed)
6 Steps (1 failed, 5 passed)
0m0.152s
Results :
Failed tests: Friday is Friday(Is it Friday yet?): expected:<[TGIF]> but was:<[Nope]>
Tests run: 2, Failures: 1, Errors: 0, Skipped: 0
可以看到Cucumber一共run了2個(gè)scenario恃锉,有一個(gè)失敗了;其中一共run了6個(gè)步驟呕臂,有一個(gè)失敗了破托,失敗的是第二個(gè)scenario的最后一個(gè)步驟:Friday is Friday,期望值是TGIF歧蒋,但是實(shí)際值是Nope土砂。
我們將IsItFriday這個(gè)類改一下,改為:
class IsItFriday {
static String isItFriday(String today) {
if (today.equals("Friday")) {
return "TGIF";
}
return "Nope";
}
}
然后再run一遍mvn test谜洽,可以看到此時(shí)結(jié)果為SUCCESS
Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
六萝映、添加多個(gè)測(cè)試數(shù)據(jù)
用過其他自動(dòng)化測(cè)試的同學(xué)應(yīng)該知道,我們可以使用變量定義多個(gè)不同的測(cè)試數(shù)據(jù)阐虚,然后同一個(gè)scenario會(huì)使用每一個(gè)測(cè)試數(shù)據(jù)來跑一遍測(cè)試序臂。
首先,我們將feature文件里的scenario改為scenario outline实束,然后改一些相應(yīng)的描述:
Feature: Is it Friday yet?
Everybody wants to know when it's Friday
Scenario Outline: Today is or is not Friday
Given today is "<day>"
When I ask whether it's Friday yet
Then I should be told "<answer>"
Examples:
| day | answer |
| Friday | TGIF |
| Sunday | Nope |
| anything else! | Nope |
然后我們將Stepdefs這個(gè)類中Given-When-Then改一下奥秆,改為:
@Given("^today is \"([^\"]*)\"$")
public void today_is_Someday(String today) throws Exception {
this.today=today;
}
@When("^I ask whether it's Friday yet$")
public void i_ask_whether_it_s_Friday_yet() throws Exception {
actualAnswer = IsItFriday.isItFriday(today);
}
@Then("^I should be told \"([^\"]*)\"$")
public void i_should_be_told(String expectedAnswer) throws Exception {
assertEquals(expectedAnswer, actualAnswer);
}
然后運(yùn)行mvn test,我們可以看到咸灿,一共執(zhí)行了3次scenario构订,每一次用的數(shù)據(jù)對(duì)應(yīng)feature中example的每一條數(shù)據(jù),并且都通過了:
Examples:
Scenario Outline: Today is or is not Friday # hellocucumber/is_it_friday_yet.feature:11
Given today is "Friday" # Stepdefs.today_is_Someday(String)
When I ask whether it's Friday yet # Stepdefs.i_ask_whether_it_s_Friday_yet()
Then I should be told "TGIF" # Stepdefs.i_should_be_told(String)
Scenario Outline: Today is or is not Friday # hellocucumber/is_it_friday_yet.feature:12
Given today is "Sunday" # Stepdefs.today_is_Someday(String)
When I ask whether it's Friday yet # Stepdefs.i_ask_whether_it_s_Friday_yet()
Then I should be told "Nope" # Stepdefs.i_should_be_told(String)
Scenario Outline: Today is or is not Friday # hellocucumber/is_it_friday_yet.feature:13
Given today is "anything else!" # Stepdefs.today_is_Someday(String)
When I ask whether it's Friday yet # Stepdefs.i_ask_whether_it_s_Friday_yet()
Then I should be told "Nope" # Stepdefs.i_should_be_told(String)
3 Scenarios (3 passed)
9 Steps (9 passed)
0m0.080s
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.26 sec
Results :
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.456 s
[INFO] Finished at: 2020-05-19T16:45:18+08:00
[INFO] ------------------------------------------------------------------------
注:本文內(nèi)容參考官方原版英文教程:https://cucumber.io/docs/guides/10-minute-tutorial/#create-an-empty-cucumber-project