Cucumber自動(dòng)化測(cè)試入門教程——HelloCucumber

本文是作者學(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末避矢,一起剝皮案震驚了整個(gè)濱河市悼瘾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌审胸,老刑警劉巖亥宿,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異歹嘹,居然都是意外死亡箩绍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門尺上,熙熙樓的掌柜王于貴愁眉苦臉地迎上來材蛛,“玉大人圆到,你說我怎么就攤上這事”翱裕” “怎么了芽淡?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豆赏。 經(jīng)常有香客問我挣菲,道長,這世上最難降的妖魔是什么掷邦? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任白胀,我火速辦了婚禮,結(jié)果婚禮上抚岗,老公的妹妹穿的比我還像新娘或杠。我一直安慰自己,他們只是感情好宣蔚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布向抢。 她就那樣靜靜地躺著,像睡著了一般胚委。 火紅的嫁衣襯著肌膚如雪挟鸠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天亩冬,我揣著相機(jī)與錄音艘希,去河邊找鬼。 笑死鉴未,一個(gè)胖子當(dāng)著我的面吹牛枢冤,可吹牛的內(nèi)容都是我干的鸠姨。 我是一名探鬼主播铜秆,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼讶迁!你這毒婦竟也來了连茧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤巍糯,失蹤者是張志新(化名)和其女友劉穎啸驯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祟峦,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罚斗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宅楞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片针姿。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡袱吆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出距淫,到底是詐尸還是另有隱情绞绒,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布榕暇,位于F島的核電站蓬衡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏彤枢。R本人自食惡果不足惜狰晚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缴啡。 院中可真熱鬧家肯,春花似錦、人聲如沸盟猖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽式镐。三九已至反镇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娘汞,已是汗流浹背歹茶。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留你弦,地道東北人惊豺。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像禽作,于是被迫代替她去往敵國和親尸昧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354