Edited at

CasperJS xUnit スタックトレース 方法

More than 3 years have passed since last update.

CasperJSでxUnit形式のxmlを吐くには、testコマンドで--xunitオプションを指定すれば良いのですが。

どうせならjenkinsなどに喰わせてテスト結果でスタックトレースを表示したいわけです。

test.assert〜系のメソッドは最終引数に任意のメッセージを渡すことができるので詳細メッセージを渡してやります。

casper.test.begin('sputniknews test', 2, function (test) {

casper
.start('http://jp.sputniknews.com/podcasts_offtopic/20160605/2253131.html')
.then(function () {
test.assertTitle('ウラ―!「お便りスパシーバ」復活第10記念号');
})
.then(function () {
var likeCount = this.evaluate(function() {
return __utils__.findOne('.b-counters-icon_like').textContent;
});
test.assertTruthy(likeCount > 100, 'like数が足りないようだ。\n実際は' + likeCount + '件しかない。\nこれは合衆国の陰謀である。');
})
.run(function () {
test.done();
casper.exit();
});
});

実行ログ

# sputniknews test

PASS sputniknews test (2 tests)
PASS Page title is: "ウラ―!「お便りスパシーバ」復活第10記念号"
FAIL like数が足りないようだ。
実際は5件しかない。
これは合衆国の陰謀である。
# type: assertTruthy
# file: main.js
# subject: false
FAIL 2 tests executed in 8.786s, 1 passed, 1 failed, 0 dubious, 0 skipped.

Details for the 1 failed test:

...

結果のlog.xml

<?xml version="1.0" encoding="UTF-8"?>

<testsuites time="8.432">
<testsuite name="sputniknews test" tests="2" failures="1" errors="0" time="8.432" timestamp="2016-06-06T14:13:07.362Z" package="main">
<testcase name="Page title is: &quot;ウラ―!「お便りスパシーバ」復活第10記念号&quot;" classname="main" time="8.411"/>
<testcase name="like数が足りないようだ。
実際は5件しかない。
これは合衆国の陰謀である。"
classname="main" time="0.021">
<failure type="assertTruthy">
<![CDATA[like数が足りないようだ。
実際は5件しかない。
これは合衆国の陰謀である。]]>

</failure>
</testcase>
<system-out><![CDATA[]]></system-out>
</testsuite>
</testsuites>

テスト名までスタックトレースのメッセージになってしまいました。

ひでぇことしやがる…

そこで test.passtest.fail を使います。

test.fail はテストを強制的に失敗扱いにして、testcaseに任意のスタックと属性値を設定できます。

test.pass はテスト名を指定して成功扱いにします。

casper.test.begin('sputniknews test', 2, function (test) {

casper
.start('http://jp.sputniknews.com/podcasts_offtopic/20160605/2253131.html')
.then(function () {
test.assertTitle('ウラ―!「お便りスパシーバ」復活第10記念号');
})
.then(function () {
var likeCount = this.evaluate(function() {
return __utils__.findOne('.b-counters-icon_like').textContent;
});
if (likeCount > 100) {
test.pass('like test');
} else {
test.fail('like数が足りないようだ。\n実際は' + likeCount + '件しかない。\nこれは合衆国の陰謀である。', {name : 'like test'});
}
})
.run(function () {
test.done();
casper.exit();
});
});

結果

<?xml version="1.0" encoding="UTF-8"?>

<testsuites time="11.475">
<testsuite name="sputniknews test" tests="2" failures="1" errors="0" time="11.475" timestamp="2016-06-06T14:15:31.361Z" package="main">
<testcase name="Page title is: &quot;ウラ―!「お便りスパシーバ」復活第10記念号&quot;" classname="main" time="11.454"/>
<testcase name="like test" classname="main" time="0.021"><failure type="fail">
<![CDATA[like数が足りないようだ。
実際は5件しかない。
これは合衆国の陰謀である。]]>

</failure>
</testcase>
<system-out><![CDATA[]]></system-out>
</testsuite>
</testsuites>

無事にtestcase nameとスタックトレースが分離できました。

この手に限る。