ReadCloverDb.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package com.frk.main;
  2. import com.atlassian.clover.CloverDatabase;
  3. import com.atlassian.clover.CodeType;
  4. import com.atlassian.clover.CoverageData;
  5. import com.atlassian.clover.CoverageDataSpec;
  6. import com.atlassian.clover.api.registry.*;
  7. import com.atlassian.clover.recorder.PerTestCoverage;
  8. import com.atlassian.clover.registry.entities.FullBranchInfo;
  9. import com.atlassian.clover.registry.entities.FullProjectInfo;
  10. import com.atlassian.clover.registry.entities.PackageFragment;
  11. import com.atlassian.clover.registry.entities.TestCaseInfo;
  12. import java.io.PrintStream;
  13. import java.util.BitSet;
  14. import java.util.HashMap;
  15. import java.util.HashSet;
  16. import java.util.Set;
  17. /**
  18. * @date 2024/4/11
  19. */
  20. public class ReadCloverDb {
  21. static BitSet bs;
  22. static double totalBranches = 0.0;
  23. static double coverageBranches = 0.0;
  24. static int originTestCase = 0;
  25. static HashMap<BranchInfo, TestCaseInfo> branchInfoTestCaseInfoHashMap = new HashMap<>();
  26. static HashSet<BranchInfo> allBranchInfo = new HashSet<>();
  27. static HashSet<TestCaseInfo> existTestCase = new HashSet<>();
  28. public static void main(String[] args) throws Exception {
  29. String s = "D:\\learn\\junit-test\\test\\solve\\EightQueens_1664963256377\\target\\clover\\clover.db";
  30. //String s = "D:\\learn\\junit-test\\openclover\\target\\clover\\clover.db";
  31. // read clover database together with coverage recording files, use time span=0 (latest build)
  32. CloverDatabase db = CloverDatabase.loadWithCoverage(s, new CoverageDataSpec());
  33. ProjectInfo projectInfo = db.getRegistry().getProject();
  34. FullProjectInfo model = db.getModel(CodeType.ALL);
  35. // print some project details
  36. CoverageData cd= db.getCoverageData();
  37. BitSet allHits = cd.getAllHits();
  38. bs = allHits;
  39. printProject(projectInfo, System.out, cd);
  40. System.out.println(coverageBranches / totalBranches * 100);
  41. System.out.println(allHits);
  42. // 原来的测试用例数量
  43. originTestCase = cd.getTests().size();
  44. System.out.println("原来的测试用例数量 " + originTestCase);
  45. // 约简后的测试用例数量:
  46. System.out.println("约简后的测试用例数量 " + existTestCase.size());
  47. System.out.println("约简后的分支覆盖率 " + branchInfoTestCaseInfoHashMap.size()/totalBranches * 100);
  48. // Map<TestCaseInfo, BitSet> map = cd.mapTestsAndCoverageForFile();
  49. // Set<TestCaseInfo> testsCovering = cd.getTestsCovering(model);
  50. // for (TestCaseInfo testCaseInfo : testsCovering) {
  51. // System.out.println();
  52. // }
  53. // System.out.println(allHits);
  54. // Set<TestCaseInfo> tests = cd.getTests();
  55. // for (TestCaseInfo test : tests) {
  56. // BitSet hitsFor = cd.getHitsFor(test);
  57. // System.out.println(test);
  58. // System.out.println(hitsFor);
  59. // }
  60. }
  61. private static void printProject(ProjectInfo db, PrintStream out, CoverageData cd) {
  62. for (PackageInfo packageInfo : db.getAllPackages()) {
  63. out.println("package: " + packageInfo.getName());
  64. for (FileInfo fileInfo : packageInfo.getFiles()) {
  65. out.println("\tfile: " + fileInfo.getName());
  66. for (ClassInfo classInfo : fileInfo.getClasses()) {
  67. out.println("\t\tclass: " + classInfo.getName());
  68. for (MethodInfo methodInfo : classInfo.getMethods()) {
  69. out.println("\t\t\tmethod: " + methodInfo.getName());
  70. for (BranchInfo branchInfo: methodInfo.getBranches()) {
  71. allBranchInfo.add(branchInfo);
  72. totalBranches += 1.0;
  73. /*
  74. 这些bitset代表了分支的编号
  75. */
  76. System.out.println("\t\t\t\tbrach: " + branchInfo.getContext());
  77. int startLine = branchInfo.getStartLine();
  78. System.out.println("\t\t\t\t\tbranch Line: " + startLine);
  79. FullBranchInfo fullBranchInfo = (FullBranchInfo) branchInfo;
  80. Set<TestCaseInfo> testsCovering = cd.getTestsCovering(fullBranchInfo);
  81. System.out.println("\t\t\t\t\tcoverage By: " + testsCovering);
  82. if (!branchInfoTestCaseInfoHashMap.containsKey(branchInfo)) {
  83. boolean hasTestCase = false;
  84. for (TestCaseInfo testCaseInfo : testsCovering) {
  85. if (existTestCase.contains(testCaseInfo)) {
  86. branchInfoTestCaseInfoHashMap.put(branchInfo, testCaseInfo);
  87. hasTestCase = true;
  88. break;
  89. }
  90. }
  91. if (!hasTestCase && !testsCovering.isEmpty()) {
  92. TestCaseInfo testCaseInfo = testsCovering.iterator().next();
  93. branchInfoTestCaseInfoHashMap.put(branchInfo, testCaseInfo);
  94. existTestCase.add(testCaseInfo);
  95. }
  96. }
  97. for (TestCaseInfo testCaseInfo : testsCovering) {
  98. // 该分支之前记录没有被覆盖
  99. BitSet hitsFor = cd.getHitsFor(testCaseInfo);
  100. System.out.println("\t\t\t\t\ttestCaseInfo " +testCaseInfo.getTestName() +": " + hitsFor);
  101. }
  102. if (branchInfo.getHitCount() > 0) {
  103. coverageBranches += 1.0;
  104. }
  105. // int dataIndex = branchInfo.getDataIndex();
  106. // int len = branchInfo.getDataLength();
  107. // System.out.println("\t\t\t\t\tcoverage: " +bs.get(dataIndex,dataIndex + len));
  108. }
  109. }
  110. }
  111. }
  112. }
  113. }
  114. }