承接上一个 Cucumber。
背景
此文承接上一个cucumber does not go to afterstep when the step failed中提到的,不管step的result是什么,都执行某个操作,那么,如果想要输出每个step的logger信息,怎么办?
你可能会问,cucumber执行时,会输出每一步的执行情况,为什么还要获取这些logger?应用的场景其实还是有的,比如你需要将每一步的logger保存到指定文件然后进行汇总统计,又或者调用这些logger信息新建实例等等。
具体实现方面,我用了一个比较笨的方法,拼接了各种信息,最终的效果是这样子的:
当step通过时,输出step的name,含关键字:Given/When/Then;
当step未通过时,输出提示信息;
你可以看到我输出的logger info,与cucumber自带的输出内容是一样的。
当然,我相信这个问题一定有更好的解决方法,但目前全网搜索,没找到特别惊喜的解答。
先附上我小白式的破解方法。
正文
依然采用了test step finished event。
在features/support
下新建event.rb
文件,放入以下内容:
require 'logger'
$logger = Logger.new(STDOUT)
AfterConfiguration do |config|
config.on_event :test_step_finished do |event|
name = event.test_step.text
if name != "AfterStep hook" && name != "Before hook" && name != "After hook"
keyword = event.test_step.source.last.keyword
status = event.result.to_sym.to_s
step = keyword + name
# logger info
if status == "passed"
$logger.info("\n" + step + "\n")
else
exception_message = event.attributes.last.exception.message
exception_class = event.attributes.last.exception.class
file_line = event.attributes.last.exception.backtrace[-2]
# 用sub将出错的文件地址转化为相对地址
file_line.sub! Dir.pwd, "."
step_line = event.attributes.last.exception.backtrace.last
message = step + "\n" + exception_message + "(" + exception_class.to_s + ")\n" + file_line + "\n" + step_line
$logger.info("\n" + message + "\n" )
end
end
end
end
这里,分步走。
- 先获取step的name,根据name筛选出我们需要的step,比如点击登陆选项,输入邮箱密码等,然后获取关键字keyword【Given/When/Then】,组成完整的一个step描述。同时获取step的状态,也就是result。
- 根据step的status来确定logger的内容,passed则输出keyword + name即可,不是passed,则获取出错的信息message,出错的类型class,出错的文件地址,出错的step 地址,然后输出信息即可。
【这里,我给$logger.info传递了换行符”\n”,仅仅是为了输出的时候好看点而已,可以忽略。】
OK,很简单是不是?但是整个的求解过程还是比较纠结的,主要这方面的资料并不多,戳这里可以了解下cucumber 的step exception。
The End
stack overflow上只找到了How can I have ruby logger log for each line of execution?
提问者接受了这个答案,抱歉,我是真的没看懂通过这个答案要怎么去解决那个问题。
如果有看懂解答的,请吱个声,下方留言或这里走一走。