如何在fastlane扫描中识别失败的测试用例以重新运行?

问题描述:

作为向我们的CI流中添加XCode的UI测试的一部分,我决定在构建失败之前实现重新运行失败的测试,这是由于测试框架的一般不可靠性。如何在fastlane扫描中识别失败的测试用例以重新运行?

我可以避免使用rescue块立即生成失败,这不是问题,报告文件(JUnit和HTML)的位置是固定的,因此可以使用File.readlines打开。

junit报告文件的格式是级联的testsuites - > testsuite - > testcase - >失败消息(如果适用),然后退出足够远的下一个元素。看起来很标准。

但是,在那一点上,我有点卡住了(它可能不是正确的道路,是否有一个更好的方法来做到这一点呢?)。在bash中,我将使用grep -B在失败消息之前提取行,这将是失败的测试用例的名称,然后使用awk获取相关的文本片段。简单的两个管道shell命令,然后我可以使用-only-testing参数反馈到scan/xcodebuild。

有没有一种方法可以在Ruby中实现同等的简单性,或者是一个junit插件,它可以让我读出除了单个失败测试用例的名称之外的任何东西?

万一有人运行到这个问题,在将来某个时候:

def parse_ui_test_report 
doc = File.open("#{REPORT_LOCATION}/report.junit") { |f| Nokogiri::XML(f) } 
node_tree = doc.css('testcase') 
test_identifiers_to_rerun = node_tree.map do |node| 
    # Test case nodes in the JUNIT XML doc don't have children unless they failed 
    if node.first_element_child 
    node.values.join('/').gsub('.','/') 
    end 
end.select {|str| !str.nil? && !str.empty? } 

return test_identifiers_to_rerun 
end