2017-02-17 1 views
0

Dans le cadre de l'ajout des tests d'interface utilisateur de XCode à notre flux CI, j'ai décidé d'implémenter de nouveaux tests ayant échoué avant d'échouer la construction, en raison de la non-fiabilité générale du framework de test.Comment identifier les cas de test ayant échoué dans le scan Fastlane pour réexécution?

Je peux éviter d'échouer la construction immédiatement en utilisant un bloc rescue, ce n'est pas un problème, et l'emplacement des fichiers de rapport (JUnit et HTML) est fixe, de sorte que vous pouvez l'ouvrir avec par exemple File.readlines. Le format du fichier de rapport junit est une cascade de testsuites -> testsuite -> testcase -> message d'échec le cas échéant, puis recule suffisamment loin pour l'élément suivant. Cela semble assez standard.

Cependant, à ce stade, je suis un peu coincé (et ce n'est peut-être pas le bon chemin, existe-t-il une meilleure façon canonique de le faire en premier lieu?). Dans bash j'utiliserais grep -B pour retirer la ligne avant le message d'échec, qui serait le nom du cas de test défaillant, puis prenez l'extrait de texte pertinent en utilisant awk. Commande de shell facile à deux tubes que je peux ensuite retourner dans scan/xcodebuild en utilisant le paramètre -only-testing.

Existe-t-il un moyen de le faire avec une facilité équivalente dans Ruby, ou un plugin junit qui ne me laisse lire que les noms des cas de tests individuels qui échouent?

Répondre

1

Dans le cas où quelqu'un court sur cette question dans le futur:

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