Commit Diff


commit - 4ba5f6ce4102f1025c7af6fb59093b8fab5bd87c
commit + d70a23bd7b159b2473a3a364b98a56becb81afb1
blob - 30faf0f920a3d246386bc341c4507c02db33a676
blob + 32229afe9e3b17402c5fb5fbf7ff8cdbf78aed86
--- README.md
+++ README.md
@@ -16,4 +16,5 @@ $ ./generate.py --data tests/static/additional-propert
 ## Features:
 
 - generate self-containing HTML report with anchor web-links
+- generate JUnit report
 - generate patches for each mutant
blob - 71f14b87f91feebf8d675ca16719a501977b82b1
blob + 8af43e582c1b83a477cef6a5b4dde81880704551
--- generate.py
+++ generate.py
@@ -4,9 +4,13 @@ import argparse
 import datetime
 import json
 import os
-
+from junit_xml import TestSuite, TestCase
 from jinja2 import Template
 
+FORMAT_TEXT = "text"
+FORMAT_HTML = "html"
+FORMAT_JUNIT = "junit"
+
 STATUS_KILLED = "Killed"
 STATUS_SURVIVED = "Survived"
 STATUS_NO_COVERAGE = "NoCoverage"
@@ -264,6 +268,27 @@ Generated by <a href="https://github.com/ligurio/py-mu
 </html>
 """
 
+def to_junit(json_data):
+        suites = []
+        for file_name, properties in json_data["files"].items():
+            source_code = properties.get("source", None)
+            test_cases = []
+            for mutants in properties["mutants"]:
+                    # mutatorName = mutants.get("mutatorName", None)
+                    mutant_id = mutants["id"]
+                    replacement = mutants.get("replacement", None)
+                    status = mutants.get("status", None)
+                    stderr = ""
+                    stdout = ""
+                    if status == STATUS_SURVIVED:
+                        stderr = replacement
+                        stdout = replacement
+                    test_case = TestCase(mutant_id, stderr, 0, stdout, stderr)
+                    test_cases.append(test_case)
+            suites.append(TestSuite(file_name, test_cases))
+
+        return TestSuite.to_xml_string(suites)
+
 def print_stdout(json_data):
 	schema_version = json_data.get("schemaVersion", None)
 	print("Version:", schema_version)
@@ -366,8 +391,8 @@ if __name__ == "__main__":
 			required=True, help="Path to a JSON data (required)")
 	parser.add_argument("--report", dest="report_path", default="",
 			help="Path to a generated report")
-	parser.add_argument("--html", dest="html", action="store_true",
-			help="Use HTML in a generated report")
+	parser.add_argument("--format", dest="format", default=FORMAT_TEXT,
+			help="Format of generated report")
 	args = parser.parse_args()
 
 	if not os.path.exists(args.data_path):
@@ -384,11 +409,17 @@ if __name__ == "__main__":
 		print("Version of schema ({}) used in a report is unsupported.".format(schema_version))
 		exit(1)
 
-	template = DEFAULT_TEXT_TEMPLATE
-	if args.html:
-		template = DEFAULT_HTML_TEMPLATE
+	report_data = ""
+	if args.format == FORMAT_TEXT:
+		report_data = render_template(json_data, DEFAULT_TEXT_TEMPLATE)
+	elif args.format == FORMAT_HTML:
+		report_data = render_template(json_data, DEFAULT_HTML_TEMPLATE)
+	elif args.format == FORMAT_JUNIT:
+		report_data = to_junit(json_data)
+	else:
+		print("Unknown report format '{}'.".format(args.format))
+		exit(1)
 
-	report_data = render_template(json_data, template)
 	if args.report_path:
 		with open(args.report_path, "w") as report:
 			report.write(report_data)
blob - 4f6007e1f0a673afba3c40376d5e019845c6bf03
blob + b27592b9a85fc689b78994aaedf0b40455d07775
--- requirements.txt
+++ requirements.txt
@@ -1,2 +1,3 @@
 Jinja2==2.11.3
 pytest==6.1.2
+junit-xml==1.9