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

Ruby 如何在fastlane扫描中识别失败的测试用例以便重新运行?,ruby,junit,xcodebuild,fastlane,Ruby,Junit,Xcodebuild,Fastlane,作为将XCode的UI测试添加到CI流的一部分,我决定在构建失败之前重新运行失败的测试,因为测试框架通常不可靠 通过使用rescue块,我可以避免构建立即失败,这不是问题,报告文件(JUnit和HTML)的位置是固定的,因此可以使用eg File.readlines打开 junit报告文件的格式是testsuite->testsuite->testcase->failure消息(如果适用)的级联,然后返回到下一个元素。看起来很标准 然而,在这一点上,我有点被卡住了(这可能不是正确的道路;首先有没

作为将XCode的UI测试添加到CI流的一部分,我决定在构建失败之前重新运行失败的测试,因为测试框架通常不可靠

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

junit报告文件的格式是testsuite->testsuite->testcase->failure消息(如果适用)的级联,然后返回到下一个元素。看起来很标准

然而,在这一点上,我有点被卡住了(这可能不是正确的道路;首先有没有一个规范的更好的方法来做到这一点?)。在bash中,我将使用grep-B拉出失败消息之前的行,这将是失败测试用例的名称,然后使用awk获取相关的文本片段。简单的双管道shell命令,然后我可以使用-only测试参数将其反馈到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