获取cucumber中每一个step的logger信息

承接上一个 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?

提问者接受了这个答案,抱歉,我是真的没看懂通过这个答案要怎么去解决那个问题。

如果有看懂解答的,请吱个声,下方留言或这里走一走