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?