How to profile integration tests in java

28 Views Asked by At

Consider the following sample source code:

public class Test2 {
    public boolean isSerialKeyValid(String serial) {
        if (!serial.toLowerCase().startsWith("@v3")) {
            return isV1V2SerialValid(serial);
        }
        return isV3SerialValid(serial);
    }

    private boolean isV1V2SerialValid(String serial) {
        if (serial.toLowerCase().startsWith("@v1")) {
            String serialValue = serial.split("@v1")[1];
            return isV1ChecksumValid(serialValue);
        }
        String serialValue = serial.split("@v2")[1];
        return isV2ChecksumValid(serialValue);
    }

    private boolean isV1ChecksumValid(String v1Serial) {
        if (!v1Serial.matches("\\d+")) {
            return false;
        }
        String[] items = v1Serial.split("\\d");
        int sum = 0;
        for (String item : items) {
            sum += Integer.parseInt(item);
        }
        return sum % 13 == 0;
    }

    private boolean isV2ChecksumValid(String v2Serial) {
        String trimmedSerial = v2Serial.trim();
        if (trimmedSerial.length() != 8) {
            return false;
        }
        return trimmedSerial.matches("[^A-Za-z]+\\w{3}[^A-Za-z]+");
    }

    private boolean isV3SerialValid(String v3Serial) {
        String serialValue = v3Serial.split("@v3")[1];
        return isV3ChecksumValid(serialValue);
    }

    private boolean isV3ChecksumValid(String v3Serial) {
        return v3Serial.length() == 10 && v3Serial.matches(".*@!=.*");
    }
}

and the following test suit:

public class Test2Test {
    @Test
    public void validateV1Serial() {
        Test2 test2 = new Test2();
        assertEquals(true, test2.isSerialKeyValid("@v176"));
        assertEquals(false, test2.isSerialKeyValid("@v1A76"));
        assertEquals(true, test2.isSerialKeyValid("@v11345"));
        assertEquals(false, test2.isSerialKeyValid("@v1#23ali$"));
    }

    @Test
    public void validateV2Serial() {
        Test2 test2 = new Test2();
        assertEquals(true, test2.isSerialKeyValid("@v2123ali34"));
        assertEquals(true, test2.isSerialKeyValid("@v2123cdf34"));
        assertEquals(false, test2.isSerialKeyValid("@v2123c@f34"));
        assertEquals(false, test2.isSerialKeyValid("@v2123ali3"));
        assertEquals(false, test2.isSerialKeyValid("@v212ali34"));
        assertEquals(false, test2.isSerialKeyValid("@v2ali3456"));
        assertEquals(false, test2.isSerialKeyValid("@v276456ali"));
   }

   @Test
   public void validateV3Serial() {
        Test2 test2 = new Test2();
        assertEquals(true, test2.isSerialKeyValid("@v312345@!=32"));
        assertEquals(true, test2.isSerialKeyValid("@V312345@!=32"));
        assertEquals(true, test2.isSerialKeyValid("@v3@!=12345ab"));
        assertEquals(true, test2.isSerialKeyValid("@v3.1@!=12345ab"));
        assertEquals(false, test2.isSerialKeyValid("@v3@!=1234@!$3"));
        assertEquals(false, test2.isSerialKeyValid("@v3@!asadzfdfdrf1234234!="));
   }
}

How can I programmatically profile test execution for each test case? The minimum required information for me is test final result(whether it is passed/failed), and memory info (variables and parameters value when a method is called). And I want it for each test case in the above test suit separately. For example, the part of sample minimum info I want for the following line

assertEquals(true, test2.isSerialKeyValid("@v2123ali34"));

is:

{
     targetMethod: TestSuit2.Test2#isSerialKeyValid,
     finalResult: Passed,
     expectedResult: true, // value the test is expected to receive
     methodCallInfo: [
          {
              methodName: TestSuit2.Test2#isSerialKeyValid,
              parametersValue:[
                  {
                      paramName: serial,
                      paramValue: "@v2123ali34"
                  }
              ]
          },
          {
              methodName: TestSuit2.Test2#isV1V2SerialValid,
              parametersValue:[
                  {
                      paramName: serial,
                      paramValue: "@v2123ali34"
                  }
              ]
          },
          {
              methodName: Java.Lang.String#toLowerCase,
              parametersValue:[
                  {
                      paramName: ?,
                      paramValue: "@v2123ali34"
                  }
              ],
          },
          ...
     ]
     ...
}

This info should be generated for each test case. This information will be used for further analysis about each method. Using IDE tools is not interested.

I think some instrumentation or profiler libraries like JUnitCore or JProfiler might be used. But I have no idea what is the best library and how should i do it?

0

There are 0 best solutions below