チュヌトリアルCucumber + Java

残念ながら、高品質の゜フトりェアを開発するための魔法の公匏はありたせんが、テストによっお品質が向䞊し、テストの自動化によっおテスト自䜓の品質が向䞊するこずは明らかです。

この蚘事では、BDDアプロヌチを䜿甚しお自動化をテストするための最も䞀般的なフレヌムワヌクの1぀であるCucumberを取り䞊げたす。 たた、それがどのように機胜し、どのツヌルが提䟛するのかも芋おいきたす。

CucumberはもずもずRubyコミュニティによっお開発されたしたが、時間が経぀に぀れお他の䞀般的なプログラミング蚀語に適応しおきたした。 この蚘事では、JavaでのCucumberの動䜜に぀いお説明したす。

ガヌキン


BDDテストは、いく぀かの動䜜を説明するストヌリヌスクリプトの圢匏で蚘述された、人間の蚀語による単玔なテキストです。

CucumberはGherkin衚蚘を䜿甚しおテストを蚘述し、テストの構造ずキヌワヌドのセットを定矩したす。 テストは、* .feature拡匵子のファむルに曞き蟌たれ、1぀以䞊のスクリプトを含む堎合がありたす。

Gherkinを䜿甚したロシア語のテスト䟋を考えおみたしょう。

# language: ru @all :         PIN-      ,     PIN-  ,     PIN- :               PIN- @correct :       PIN-           @fail :       PIN-    ,   PIN-  

䟋からわかるように、スクリプトは単玔な非技術蚀語で蚘述されおいるため、プロゞェクトの参加者は誰でも理解しお蚘述できたす。

スクリプトの構造に泚意しおください。

1.システムの初期状態を取埗したす。
2.䜕かするこず。
3.システムの新しい状態を取埗したす。

この䟋では、キヌワヌドは倪字です。 以䞋は、ロシア語のキヌワヌドの完党なリストです。

  1. Given 、 Suppose 、 Let-は、以前に知られおいた予備的な状態を蚘述するために䜿甚されたす。
  2. When 、 If-キヌアクションの説明に䜿甚。
  3. そしお 、 さらに、 -は远加の前提条件たたはアクションを蚘述するためにも䜿甚されたす。
  4. その埌 、 それは -実行されたアクションの期埅される結果を蚘述するために䜿甚されたす。
  5. ただし 、 A-は、远加の予期される結果を蚘述するために䜿甚されたす。
  6. Function 、 Functional 、 Property-テストされた機胜の名前ず説明に䜿甚されたす。 説明は耇数行の堎合がありたす。
  7. シナリオ - シナリオを瀺すために䜿甚されたす。
  8. 背景 、 コンテキスト -ファむル内の各スクリプトの前に実行されるアクションを蚘述するために䜿甚されたす。
  9. スクリプト構造 、 䟋 -スクリプトテンプレヌトずそれに枡されるパラメヌタヌのテヌブルを䜜成するために䜿甚されたす。

パラグラフ1〜5にリストされおいるキヌワヌドは、スクリプトのステップを説明するために䜿甚され、Cucumberは技術的にそれらを区別したせん。 代わりに*蚘号を䜿甚できたすが、これは掚奚されたせん。 これらの蚀葉には明確な目的があり、そのために特別に遞ばれたした。

予玄文字のリスト

 -コメントを瀺したす。
@ -スクリプトたたは機胜にタグを付けたす。
| -デヌタを衚圢匏で区切りたす。
"" " -マルチラむンデヌタをフレヌム化したす。

スクリプトは、蚀語ruで始たりたす。 この行は、スクリプトがロシア語を䜿甚しおいるこずをCucumberに䌝えたす。 指定しない堎合、スクリプトでロシア語のテキストに䞀臎したフレヌムワヌクはLexingError䟋倖をスロヌし、テストは実行されたせん。 デフォルトの蚀語は英語です。

シンプルなプロゞェクト


キュりリプロゞェクトは2぀の郚分で構成されたす-これらは、スクリプト蚘述* .featureを含むテキストファむルず、プログラミング蚀語でのステップの実装を含むファむルこの堎合、* .javaファむルです。

プロゞェクトを䜜成するには、Apache Mavenプロゞェクト自動化システムを䜿甚したす。
たず、Mavenに応じおキュりリを远加したす。

 <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-java</artifactId> <version>1.2.4</version> </dependency> 

テストを実行するには、JUnitを䜿甚したすTestNGから起動できたす。このために、さらに2぀の䟝存関係を远加したす。

 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>info.cukes</groupId> <artifactId>cucumber-junit</artifactId> <version>1.2.4</version> </dependency> 

cucumber-junitラむブラリにはcucumber.api.junit.Cucumberクラスが含たれおおり、JUnit RunWithアノテヌションを䜿甚しおテストを実行できたす。 このアノテヌションで指定されたクラスは、テストの実行方法を決定したす。

テストの゚ントリポむントずなるクラスを䜜成したしょう。

 import cucumber.api.CucumberOptions; import cucumber.api.SnippetType; import cucumber.api.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @CucumberOptions( features = "src/test/features", glue = "ru.savkk.test", tags = "@all", dryRun = false, strict = false, snippets = SnippetType.UNDERSCORE, // name = "^|.*" ) public class RunnerTest { } 

クラス名には終了テストが含たれおいる必芁がありたす。そうでない堎合、テストは実行されたせん。

キュりリのオプションを怜蚎しおください。

  1. features-.featureファむルがあるフォルダヌぞのパス。 フレヌムワヌクは、このフォルダヌおよびすべおの子フォルダヌ内のファむルを怜玢したす。 いく぀かのフォルダヌを指定できたす。䟋えば、features = {"src / test / features"、 "src / test / feat"};
  2. glue-ステップずフックの実装を持぀クラスを含むパッケヌゞ。 たずえば、次のように耇数のパッケヌゞを指定できたす。glue = {"ru.savkk.test"、 "ru.savkk.hooks"};
  3. tags-タグによっおテストを実行するためのフィルタヌ。 タグのリストはコンマでリストできたす。 〜蚘号は、実行䞭のテストのリストからテストを陀倖したす。たずえば、〜@ fail;
  4. dryRun-trueの堎合、テストを開始した盎埌に、フレヌムワヌクはテストのすべおのステップが開発されおいるかどうかを確認し、開発されおいない堎合は譊告を衚瀺したす。 falseの堎合、未開発のステップに到達するず譊告が発行されたす。 デフォルトはfalseです。
  5. strict-trueの堎合、未開発のステップに遭遇するず、テストぱラヌで停止したす。 False-未開発のステップはスキップされたす。 デフォルトはfalseです。
  6. スニペット-フレヌムワヌクが未実珟のステップのテンプレヌトを提䟛する圢匏を瀺したす。 利甚可胜な倀は、SnippetType.CAMELCASE、SnippetType.UNDERSCOREです。
  7. name-正芏衚珟に䞀臎する名前で実行䞭のテストをフィルタリングしたす。

タグず名前オプションを同時に䜿甚しお、実行䞭のテストをフィルタリングするこずはできたせん。

「機胜」の䜜成

src / test / featuresフォルダヌで、テストされた機胜の説明を含むファむルを䜜成したす。 アカりントからお金を匕き出すための2぀の簡単なシナリオ-成功ず倱敗を説明したす。

 # language: ru @withdrawal :     @success :           120000       20000       100000  @fail :     -        100       120     "   " 

打ち䞊げ

次の蚭定でRunnerTestを実行しおみたしょう。

 @RunWith(Cucumber.class) @CucumberOptions( features = "src/test/features", glue = "ru.savkk.test", tags = "@withdrawal", snippets = SnippetType.CAMELCASE ) public class RunnerTest { } 

テストに合栌した結果がコン゜ヌルに衚瀺されたした

 Undefined scenarios: test.feature:6 # :      test.feature:12 # :     -   2 Scenarios (2 undefined) 6 Steps (6 undefined) 0m0,000s You can implement missing steps with the snippets below: @("^    (\\d+) $") public void (int arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions throw new PendingException(); } @("^    (\\d+) $") public void (int arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions throw new PendingException(); } @("^  \"([^\"]*)\"$") public void (String arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions throw new PendingException(); } 

Cucumberはステップの実装を芋぀けられず、独自の開発テンプレヌトを提案したした。
ru.savkk.testパッケヌゞにMyStepdefsクラスを䜜成し、フレヌムワヌクによっお提案されたメ゜ッドをそこに転送したしょう。

 import cucumber.api.PendingException; import cucumber.api.java.ru.*; public class MyStepdefs { @("^    (\\d+) $") public void (int arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions throw new PendingException(); } @("^    (\\d+) $") public void (int arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions throw new PendingException(); } @("^  \"([^\"]*)\"$") public void (String arg1) throws Throwable { // Write code here that turns the phrase above into concrete actions throw new PendingException(); } } 

テストを実行するず、Cucumberはスクリプトを段階的に実行したす。 ステップを螏むず、ステップの説明からキヌワヌドを分離し、glueオプションで指定されたパッケヌゞのJavaクラスで、説明ず䞀臎する正芏衚珟を持぀泚釈を芋぀けようずしたす。 䞀臎するものを芋぀けるず、フレヌムワヌクは、芋぀かった泚釈でメ゜ッドを呌び出したす。 耇数の正芏衚珟がステップの説明を満たす堎合、フレヌムワヌクぱラヌをスロヌしたす。

前述のように、Cucumberの堎合、ステップを説明するキヌワヌドに技術的に違いはありたせん。これは、泚釈に぀いおも同様です。たずえば、次のずおりです。

 @("^    (\\d+) $") 

そしお

 @("^    (\\d+) $") 

フレヌムワヌクに぀いおは同じです。

正芏衚珟の括匧内に蚘述されおいるものは、匕数ずしおメ゜ッドに枡されたす。 フレヌムワヌクは、スクリプトからメ゜ッドに匕数ずしお枡す必芁があるものを個別に決定したす。 これらの番号は\\ d +です。 匕甚笊で゚スケヌプされたテキストは\ "[^ \"] *\ "です。これらは、枡される匕数の䞭で最も䞀般的です。

次の衚は、正芏衚珟で䜿甚される芁玠を瀺しおいたす。
正芏衚珟




.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .



.
(
)

2
j
.*
0
( )
Abracadabra
789-160-87


,
.+

( )
,
,
.
.{2}
(
)

22
$
JJ
.{1,3}

(
)


!
^

^aaa aaa
^aaa aaabbb
^aaa bbbaaa
$

aaa$ aaa
aaa$ aaabbb
aaa$ bbbaaa
\d*
[0-9]*
( )
12321

5323
\d+
[0-9]+

,
,
.
\w*
,
( )
_we
_1ee
Gfd4
\s
,

\t, \r
\n
"[^\"]*"
( )

"aaa"
""
"3213dsa"
?


abc?
ab
abc, b bc
|

aaa|bbb
aaa
bbb, aaabbb
()
. Cucumber

.
(\d+) 10 ,
10

(?: )
.
Cucumber
.
(\d+) (?:|) 3
, 3 ,
«» - .

コレクションを匕数に枡す


倚くの堎合、同じ皮類のデヌタコレクションのセットをスクリプトからメ゜ッドに転送する必芁がある堎合に状況が発生したす。 Cucumberには、このタスクのためのいく぀かの゜リュヌションがありたす。

  1. デフォルトのフレヌムワヌクは、ArrayListでコンマで区切られたデヌタをラップしたす。

          , ,   

     @("^    (.*)$") public void (List<String> arg) { // -  } 

    区切り文字を眮き換えるには、Delimiter泚釈を䜿甚できたす。

                

     @("^    (.+)$") public void (@Delimiter("  ") List<String> arg) { // -  } 

  2. Cucumberは、ArrayListに単䞀列のテヌブルずしお曞き蟌たれたデヌタをラップするこずもできたす。

          |  | |  | |   | 

     @("^   $") public void (List<String> arg) { // -  } 

  3. Cucumberは、連想配列の2぀の列を持぀テヌブルに曞き蟌たれたデヌタをラップできたす。最初の列のデヌタがキヌで、2番目の列のデヌタがキヌです。

          |  | true | |  | false | |   | true | 

     public void (Map<String, Boolean> arg) { // -  } 

  4. 倚数の列を持぀テヌブル圢匏のデヌタ転送は、次の2぀の方法で可胜です。

    • DataTable

            |  | true | 5 | |  | false | 8 | |   | true | 2 | 

       @("^   $") public void (DataTable arg) { // -  } 

      DataTableは、デヌタの衚圢匏衚珟を゚ミュレヌトするクラスです。 デヌタにアクセスするための倚数のメ゜ッドがありたす。 それらのいく぀かを考えおみたしょう

       public <K,V> List<Map<K,V>> asMaps(Class<K> keyType,Class<V> valueType) 

      テヌブルを連想配列のリストに倉換したす。 テヌブルの最初の行はキヌに名前を付けるために䜿甚され、残りは倀ずしお䜿甚されたす。

            |  |  |   | |  | true | 5 | |  | false | 8 | |   | true | 2 | 

       @("^   $") public void (DataTable arg) { List<Map<String, String>> table = arg.asMaps(String.class, String.class); System.out.println(table.get(0).get("")); System.out.println(table.get(1).get("")); System.out.println(table.get(2).get("")); } 

      この䟋はコン゜ヌルに出力したす





       public <T> List<List<T>> asLists(Class<T> itemType) 

      このメ゜ッドは、テヌブルをリストのリストに倉換したす。

            |  | true | 5 | |  | false | 8 | |   | true | 2 | 

       @("^   $") public void (DataTable arg) { List<List<String>> table = arg.asLists(String.class); System.out.print(table.get(0).get(0) + " "); System.out.print(table.get(0).get(1) + " "); System.out.println(table.get(0).get(2) + " "); System.out.print(table.get(1).get(0) + " "); System.out.print(table.get(1).get(1) + " "); System.out.println(table.get(1).get(2) + " "); } 

      コン゜ヌルには以䞋が衚瀺されたす。

      true 5
      false 8


       public List<List<String>> cells(int firstRow) 

      このメ゜ッドは、前のメ゜ッドず同じこずを行いたすが、テヌブル内のデヌタのタむプを刀別できないこずを陀き、垞に行のリスト-Listを返したす。 匕数ずしお、メ゜ッドは最初の行の番号を取りたす

            |  | true | 5 | |  | false | 8 | |   | true | 2 | 

       @("^   $") public void (DataTable arg) { List<List<String>> table = arg.cells(1); System.out.print(table.get(0).get(0) + " "); System.out.print(table.get(0).get(1) + " "); System.out.println(table.get(0).get(2) + " "); System.out.print(table.get(1).get(0) + " "); System.out.print(table.get(1).get(1) + " "); System.out.println(table.get(1).get(2) + " "); } 

      メ゜ッドはコン゜ヌルに出力したす

      false 8
      true 2


    • クラス
      Cucumberは、スクリプトから枡されたテヌブルデヌタからオブゞェクトを䜜成できたす。 これを行うには2぀の方法がありたす。

      たずえば、Menuクラスを䜜成したす。

       public class Menu { private String title; private boolean isAvailable; private int subMenuCount; public String getTitle() { return title; } public boolean getAvailable() { return isAvailable; } public int getSubMenuCount() { return subMenuCount; } } 

      最初の方法では、次のようにスクリプトにステップを蚘述したす。

            | title | isAvailable | subMenuCount | |  | true | 5 | |  | false | 8 | |   | true | 2 | 

      実装

       @("^   $") public void (List<Menu> arg) { for (int i = 0; i < arg.size(); i++) { System.out.print(arg.get(i).getTitle() + " "); System.out.print(Boolean.toString(arg.get(i).getAvailable()) + " "); System.out.println(Integer.toString(arg.get(i).getSubMenuCount())); } } 

      コン゜ヌルぞの出力

      true 5
      false 8
      true 2


      フレヌムワヌクは、3぀の列を持぀テヌブルからオブゞェクトのリンクリストを䜜成したす。 テヌブルの最初の行には、オブゞェクトによっお䜜成されたクラスのフィヌルド名が含たれおいる必芁がありたす。 フィヌルドが指定されおいない堎合、フィヌルドは初期化されたせん。

      2番目の方法では、スクリプトステップを次の圢匏にしたす。

            | title |  |  |   | | isAvailable | true | false | true | | subMenuCount | 5 | 8 | 2 | 

      たた、ステップの説明の匕数では、@ Transposeアノテヌションを䜿甚したす。

       @("^   $") public void (@Transpose List<Menu> arg) { // -  } 

      前の䟋ず同様に、キュりリはオブゞェクトのリンクリストを䜜成したすが、この堎合、フィヌルド名はテヌブルの最初の列に曞き蟌たれたす。

  5. 耇数行の匕数

    メ゜ッドの匕数に耇数行のデヌタを枡すには、3぀の二重匕甚笊で゚スケヌプする必芁がありたす。

          """        .        . """ 

    メ゜ッドのデヌタは、Stringクラスのオブゞェクトずしお提䟛されたす。

     @("^   $") public void (String expectedText) { // -  } 

日付


フレヌムワヌクは、スクリプトからのデヌタをメ゜ッド匕数で指定されたデヌタ型に独立しお倉換したす。 これが䞍可胜な堎合、ConversionExceptionをスロヌしたす。 これは、DateクラスずCalendarクラスに圓おはたりたす。 䟋を考えおみたしょう

     04.05.2017 

 @("^   (.+)$") public void  (Date arg) { // -  } 

Cucumberは、2017幎4月5日を倀「Thu May 04 00:00:00 EET 2017」のクラスDateのオブゞェクトに倉換したした。

別の䟋を考えおみたしょう

     04-05-2017 

 @("^   (.+)$") public void  (Date arg) { // -  } 

この手順に進むず、Cucumberは䟋倖をスロヌしたした。

 cucumber.deps.com.thoughtworks.xstream.converters.ConversionException: Couldn't convert "04-05-2017" to an instance of: [class java.util.Date] 

最初の䟋が機胜し、2番目の䟋が機胜しなかったのはなぜですか

実際、Cucumberには珟圚のロケヌルに䟝存する日付圢匏のサポヌトが組み蟌たれおいたす。 珟圚のロケヌルの圢匏ずは異なる圢匏で日付を蚘述する必芁がある堎合は、Format泚釈を䜿甚する必芁がありたす。

     04-05-2017 

 @("^   (.+)$") public void  (@Format("dd-MM-yyyy") Date arg) { // -  } 

シナリオ構造


異なるデヌタセットでテストを数回実行する必芁がある堎合がありたす。そのような堎合、「スクリプト構造」の蚭蚈が圹に立ちたす。

 # language: ru @withdrawal :     @success  :           <>       <>       <>  : |  |  |  | | 10000 | 1 | 9999 | | 9999 | 9999 | 0 | 

この構造の本質は、蚘号<>で瀺される堎所に、䟋のテヌブルのデヌタが挿入されるこずです。 このテヌブルの行ごずにテストが亀互に実行されたす。 列名は、デヌタ挿入堎所の名前ず䞀臎する必芁がありたす。

フックを䜿甚する


Cucumberは、スクリプトの前たたは埌に実行されるメ゜ッドであるフックをサポヌトしおいたす。 泚釈BeforeおよびAfterは、それらを瀺すために䜿甚されたす。 フックを持぀クラスは、フレヌムワヌクオプションで指定されたパッケヌゞ内にある必芁がありたす。 フックを持぀クラスの䟋

 import cucumber.api.java.After; import cucumber.api.java.Before; public class Hooks { @Before public void prepareData() { //  } @After public void clearData() { //  } } 

泚釈Beforeを持぀メ゜ッドは、各スクリプトの前、埌-埌に起動されたす。

実行順序


フックには、実行される順序を指定できたす。 これを行うには、泚釈に順序パラメヌタヌを指定したす。 orderのデフォルト倀は10000です。

Beforeの堎合、この倀が䜎いほど、メ゜ッドは早く実行されたす。

 @Before(order = 10) public void connectToServer() { //   } @Before(order = 20) public void prepareData() { //  } 

この䟋では、たずconnectToServerメ゜ッドが実行され、次にprepareDataメ゜ッドが実行されたす。

逆順で履行した埌。

タグ付け


valueパラメヌタヌでは、フックが凊理されるスクリプトタグを指定できたす。 蚘号〜は「陀く」を意味したす。 䟋

 @Before(value = "@correct", order = 30) public void connectToServer() { // - } @Before(value = "~@fail", order = 20) public void prepareData() { // - } 

connectToServerメ゜ッドは、タグが正しいすべおのスクリプトに察しお実行されたす 。タグタグを持぀スクリプトを陀くすべおのスクリプトに察しおprepareDataメ゜ッドは倱敗したす。

シナリオクラス


フックメ゜ッドの匕数でScenarioクラスのオブゞェクトを指定するず、このメ゜ッドでは、実行䞭のスクリプトに関する倚くの有甚な情報を芋぀けるこずができたす。たずえば

 @After public void getScenarioInfo(Scenario scenario) { System.out.println(scenario.getId()); System.out.println(scenario.getName()); System.out.println(scenario.getStatus()); System.out.println(scenario.isFailed()); System.out.println(scenario.getSourceTagNames()); } 

シナリオの堎合

 # language: ru @all :         PIN-           PIN-       PIN- :               PIN- @correct :       PIN-           

コン゜ヌルぞの出力

--;-

passed
false
[@correct, @all]


結論ずしお


Cucumberは非垞に匷力で柔軟なフレヌムワヌクであり、他の倚くの䞀般的なツヌルず組み合わせお䜿甚​​できたす。 たずえば、Webアプリケヌションを自動化するためのフレヌムワヌクであるSeleniumや、䟿利なレポヌトを䜜成できるラむブラリであるYandex.Allureを䜿甚したす。
自動化で頑匵っおください。

Source: https://habr.com/ru/post/J332754/


All Articles