Page History
...
Datasæt til tests angives vha. org.junit.runners.Parameterized.Parameter. Her angiver man et index som input til annoteringen, så det peger på et specifikt Object i aktuelle Object[].
Hjælpeklasser til Parameterized tests i Seal.java
Code Block | ||||
---|---|---|---|---|
| ||||
public class SimpleVaultTest {
@Test
public void testCertificate() {
X509Certificate certificateToTest = CredentialVaultTestUtil.getCredentialVault().getSystemCredentialPair().getCertificate();
DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal());
assertEquals("Forventede noget helt andet her?", "TU GENEREL MOCES M CPR gyldig", dn.getCommonName());
}
} |
Code Block | ||||
---|---|---|---|---|
| ||||
public class SimpleVaultTest {
private X509Certificate certificateToTest;
@Before
public void setup() {
certificateToTest = CredentialVaultTestUtil.getCredentialVault().getSystemCredentialPair().getCertificate();
}
@After
public void tearDown() {
certificateToTest = null;
}
@Test
public void testCertificateCommonName() {
DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal());
assertEquals("Forventede noget helt andet her?", "TU GENEREL MOCES M CPR gyldig", dn.getCommonName());
}
@Test
public void testCertificateSubjectSerialNumber() {
DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal());
assertEquals("Forventede noget helt andet her?", "CVR:30808460-RID:42634739", dn.getSubjectSerialNumber());
}
} |
...
language | java |
---|---|
title | Simple Parametriseret Unittest |
...
Eksempel:
Code Block | ||||
---|---|---|---|---|
| ||||
@RunWith(Parameterized.class)
public class SimpleVaultTest {
@Parameter(0)
public X509Certificate certificateToTest; //Skal være public!
@Parameter(1)
public String expectedCommonName;
@Parameter(2)
public String expectedSubjectSerialNumber;
@Parameters(name ="Test {0}")
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] {{ CredentialVaultTestUtil.getCredentialVault().getSystemCredentialPair().getCertificate(),
"TU GENEREL MOCES M CPR gyldig",
"CVR:30808460-RID:42634739"
}, { CredentialVaultTestUtil.getMoces3CredentialVault().getSystemCredentialPair().getCertificate(),
"Tonnis Vestergaard",
"UI:DK-153279bd-07cb-4128-a8b1-666107fba6d5"}});
}
@Test
public void testCertificateCommonName() {
DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal());
assertEquals("Forventede noget helt andet her?", expectedCommonName, dn.getCommonName());
}
@Test
public void testCertificateSubjectSerialNumber() {
DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal());
assertEquals("Forventede noget helt andet her?", expectedSubjectSerialNumber, dn.getSubjectSerialNumber());
}
} |
Hjælpeklasser til Parameterized tests i Seal.java
I forbindelse med implemeneteringen af parametriserede tests stødte vi nogle mindre udfordringer.
- Navnet på den parametriserede test var det indeks testen havde. Så den første test hed f.eks. [0] og selve testen ville hedde testCertificateCommonName[0].
- Vi ønskede kun at det var input parametre der blev angivet som parameter i selve testen. Vi ønskede derfor ikke en angivelse af paramtre ala expectedResult1, expectedException2.....
Derfor er der implementeret følgende:
- @Parameter(0) - Bruges altid til navnet på den parametriserede test. Denne værdi kan bruges i org.junit.runners.Parameterized.Parameters ved at angive name="{0}"
- @Parameter(1) - Bruges til at holde Validators, som indeholder 0-* valideringer der kan bruges i tests.
- @Parameter(2):@Parameter(n) - Bruges til at angive de parametre der er input til tests.
Derfor er findes følgende hjælpeklasser i Seal.java:
- TestParameterBuilder - Klasse til at oprette de parametriserede tests og tilhørende data. Ved kald af build returneres en liste af arrays.
- TestParameter - For hver parametriseret test findes dette Objekt. Indholder navn, parametre og evt. valideringer.
- Validators - En samling af valideringer (Validation) som hentes og gemmes med vha. unik tekst.
- Validation - En klasse til at udføre valideringen. En validation hentes fra Validators og udstiller metoderne:
- assertSucces() og assertSuccess(resultat): Hvis testen er gennemfært uden fejl
- assertFailure() og assertFailure(exception): Hvis testen er gennemført med fejl.
- Asserter - Et interface til at implementere egen validering.
Eksempel:
Code Block | ||||
---|---|---|---|---|
| ||||
@RunWith(Parameterized.class) public class SimpleVaultTest { @Parameter(0) public String suiteName; //Then @Parameter(1) public Validators validators; //Given @Parameter(2) public X509Certificate certificateToTest; public Date validityDate; @Parameters(name = "{0}") public static Iterable<Object[]> data() { TestDataBuilderTestParameterBuilder builder = new TestDataBuilderTestParameterBuilder(); TestDataTestParameter credentialVaultTest = builder.newTest("CredentialVault"); //Given credentialVaultTest.parametersadd(CredentialVaultTestUtil.getCredentialVault().getSystemCredentialPair().getCertificate()); //Then credentialVaultTest.expect("CertificateCommonName", "TU GENEREL MOCES M CPR gyldig"); credentialVaultTest.expect("SubjectSerialNumber", "CVR:30808460-RID:42634739"); credentialVaultTest.success("CertificateValidity"); credentialVaultTest.success("Custom", notNorwayAssertion()); TestDataTestParameter moces3CredentialVaultTest = builder.newTest("Moces3CredentialVault"); //Given moces3CredentialVaultTest.parametersadd(CredentialVaultTestUtil.getMoces3CredentialVault().getSystemCredentialPair().getCertificate()); //Then moces3CredentialVaultTest.expect("CertificateCommonName", "Tonnis Vestergaard"); moces3CredentialVaultTest.expect("SubjectSerialNumber", "UI:DK-153279bd-07cb-4128-a8b1-666107fba6d5"); moces3CredentialVaultTest.fail("CertificateValidity", new CertificateNotYetValidException("NotBefore: Tue Jan 26 15:27:19 CET 2021")); moces3CredentialVaultTest.success("Custom", notNorwayAssertion()); return builder.build(); } //Custom Asserter private static Asserter notNorwayAssertion() { return (actual) -> { Assert.assertNotNull("Forventede et reultat", actual); Assert.assertTrue("Forventer instans af DistinguishedName", actual instanceof DistinguishedName); DistinguishedName dn = (DistinguishedName) actual; Assert.assertNotEquals("Forventede ikke Norge", "N", dn.getCountry()); }; } @Before public void setup() { validityDate = Date.from(Instant.parse("2020-01-01T00:00:00.00Z")); } //When @Test public void testCertificateCommonName() { DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal()); validators.getValidator("CertificateCommonName").assertSuccess(dn.getCommonName()); } @Test public void testCertificateSubjectSerialNumber() { DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal()); validators.getValidator("SubjectSerialNumber").assertSuccess(dn.getSubjectSerialNumber()); } @Test public void testCertificateValidity() throws CertificateExpiredException, CertificateNotYetValidException { Validation validator = validators.getValidator("CertificateValidity"); try { certificateToTest.checkValidity(validityDate); validator.assertSuccess(); } catch(Exception e) { validator.assertFailure(e); } } @Test public void testCustomFieldValidation() { DistinguishedName dn = new DistinguishedName(certificateToTest.getSubjectX500Principal()); validators.getValidator("Custom").assertSuccess(dn); } } |
Output af ovenstående eksempel vil være: