jenkinsにあるBUILD_TAGみたいな環境変数をMink+Behatのテストでも使いたい

FeatureContextで使う

とりあえずFeatureContext内でなんとかしてみる

  • FeatureContext.php
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class FeatureContext extends RawMinkContext implements Context, SnippetAcceptingContext
{
private $BUILD_TAG;

/**
* Initializes context.
*
* Every scenario gets its own context instance.
* You can also pass arbitrary arguments to the
* context constructor through behat.yml.
*/
public function __construct()
{
if(getenv('BUILD_TAG'))
{
$this->BUILD_TAG = getenv('BUILD_TAG');
}else{
$this->BUILD_TAG = date('Ymdhis',strtotime('now'));
}
}

/**
* @When :index 番目の :element エレメントに :text と入力する
*/
public function inputElementText($index, $element, $text)
{
if(false !== strpos($text, "{BUILD_TAG}"))
{
$text = str_replace("{BUILD_TAG}", $this->BUILD_TAG, $text);
}

$nodes = $this->getSession()->getPage()->findAll('css', $element);
$index = $index - 1;


if (isset($nodes[$index]))
{
$nodes[$index]->setValue($text);
} else {
throw new PendingException($element." エレメントが見つかりませんでした");
}
}

/**
* @When :index 番目の :element エレメントに :text テキストが含まれていること
*/
public function checkElementTextImplode($index, $element, $text)
{
if(false !== strpos($text, "{BUILD_TAG}"))
{
$text = str_replace("{BUILD_TAG}", $this->BUILD_TAG, $text);
}

$nodes = $this->getSession()->getPage()->findAll('css', $element);
$index = $index - 1;

if (isset($nodes[$index]))
{
if(false !== strpos($nodes[$index]->getHtml(),$text))
{
}else {
throw new PendingException("テキストが見つかりませんでした - ".$text." - ".$nodes[$index]->getHtml());
}
} else {
throw new PendingException($element." エレメントが見つかりませんでした");
}
}

(中略)
}
  • feature側
1
2
3
もし 1 番目の "*[name='message']" エレメントに "{BUILD_TAG}" と入力する
かつ 私が 1 番目の "#submitBtn" 要素をクリックする
ならば 1 番目の "#messageList" エレメントに "{BUILD_TAG}" テキストが含まれていること

解説

  1. プライベートなメンバ変数にBUILD_TAGを持たせる
1
2
3
class FeatureContext extends RawMinkContext implements Context, SnippetAcceptingContext
{
private $BUILD_TAG; // ※追加
  1. コンストラクタで、メンバ変数に現在時刻(Ymdhis)をセットする。
1
2
3
4
5
6
7
8
9
public function __construct()
{
if(getenv('BUILD_TAG'))
{
$this->BUILD_TAG = getenv('BUILD_TAG');
}else{
$this->BUILD_TAG = date('Ymdhis',strtotime('now'));
}
}

もし、behat実行時に環境変数BUILD_TAGが指定されていた場合はそっちを使うようにすることで、JenkinsのBUILD_TAGをそのまま渡したりすることができます

1
$ BUILD_TAG=testdaoooooo behat --profile=chrome-via-webdriver features/login.feature
  1. 普段テキストを渡すところに、{BUILD_TAG} という文字列が来たら、メンバ変数の値に差し替える
1
2
3
4
5
6
7
8
9
10
11
12
  /**
* @When :index 番目の :element エレメントに :text と入力する
*/
public function inputElementText($index, $element, $text)
{
if(false !== strpos($text, "{BUILD_TAG}")) // ※"{BUILD_TAG}"という文字列があれば
{
$text = str_replace("{BUILD_TAG}", $this->BUILD_TAG, $text); // :textを置換
}

$nodes = $this->getSession()->getPage()->findAll('css', $element);
$index = $index - 1;