소스 검색

Merge pull request #174 from jplag/166-volumetesting

Volume testing
Sebastian Hahner 5 년 전
부모
커밋
6b18a010a3
2개의 변경된 파일과 84개의 추가작업 그리고 3개의 파일을 삭제
  1. 6 3
      jplag/src/test/java/jplag/TestBase.java
  2. 78 0
      jplag/src/test/java/jplag/VolumeTest.java

+ 6 - 3
jplag/src/test/java/jplag/TestBase.java

@@ -9,8 +9,12 @@ public abstract class TestBase {
 
     private static final String BASE_PATH = "src/test/resources/samples";
 
+    protected String getBasePath() {
+        return BASE_PATH;
+    }
+
     protected JPlagResult runJPlagWithExclusionFile(String testSampleName, String exclusionFileName) throws ExitException {
-        String blackList = String.format(BASE_PATH + "/%s/%s", testSampleName, exclusionFileName);
+        String blackList = String.format(getBasePath() + "/%s/%s", testSampleName, exclusionFileName);
         return runJPlagWithOptions(testSampleName, options -> options.setExclusionFileName(blackList));
     }
 
@@ -19,11 +23,10 @@ public abstract class TestBase {
     }
 
     protected JPlagResult runJPlagWithOptions(String testSampleName, Consumer<JPlagOptions> customization) throws ExitException {
-        JPlagOptions options = new JPlagOptions(String.format(BASE_PATH + "/%s", testSampleName), LanguageOption.JAVA_1_9);
+        JPlagOptions options = new JPlagOptions(String.format(getBasePath() + "/%s", testSampleName), LanguageOption.JAVA_1_9);
         options.setDebugParser(true);
         customization.accept(options);
         JPlag jplag = new JPlag(options);
         return jplag.run();
     }
-
 }

+ 78 - 0
jplag/src/test/java/jplag/VolumeTest.java

@@ -0,0 +1,78 @@
+package jplag;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * These tests are not intended to be used automatically but rather manually prior to releases.
+ * These tests shall be used with large data sets (e.g., 100+ submissions) in order to validate the core functionality.
+ */
+public class VolumeTest extends TestBase {
+
+    /**
+     * This path ensures that volume testing data is not in the git repository (with default configuration)
+     */
+    private static final String VOLUME_BASE_PATH = "../../volume";
+
+    @Override
+    protected String getBasePath() {
+        return VOLUME_BASE_PATH;
+    }
+
+    /**
+     * This test requires a folder "data" with submissions and a file named "matches_avg.csv" inside the volume folder.
+     * Accepts a derivation of 0.1% in the matching percentage
+     */
+    @Test
+    public void volumeComparisonTest() throws ExitException, IOException {
+
+        // Always succeed if not executed in an appropriate environment
+        if(!new File(this.getBasePath()).exists()) {
+            return;
+        }
+
+        var results = runJPlagWithOptions("data",
+                jPlagOptions -> jPlagOptions.setMaxNumberOfMatches(-1));
+
+        var csv = readCSVResults(String.format("%s/%s", this.getBasePath(), "matches_avg.csv"));
+
+        assertEquals(csv.size(), results.getAllComparisons().size());
+        System.out.println("Volume test size: " + csv.size());
+
+        results.getAllComparisons().forEach(result -> {
+            var key = result.firstSubmission.name + result.secondSubmission.name;
+
+            assertTrue(csv.containsKey(key));
+            assertEquals(csv.getOrDefault(key, -1f), result.percent(), 0.1f);
+        });
+
+    }
+
+    private Map<String, Float> readCSVResults(String filePathAndName) throws IOException {
+        List<String> lines = Files.readAllLines(Path.of(filePathAndName));
+        var results = new HashMap<String, Float>();
+
+        lines.forEach(line -> {
+            var entries = line.split(";");
+
+            if(entries.length != 4) {
+                throw new IllegalArgumentException(String.format("Illegal line: '%s'", line));
+            }
+
+            results.put(entries[1] + entries[2], Float.parseFloat((entries[3])));
+        });
+
+        return results;
+    }
+}