Wie schreibe ich Unit-Tests, wenn Sie überhaupt keine Lust dazu haben?

Ab und zu versuchen sie uns bei der Arbeit zu zwingen, Unit-Tests zu schreiben. Viele haben bereits erkannt, dass sie einen Schaden anrichten. Das Schreiben von Tests nimmt viel Zeit in Anspruch, für die Sie etwas Nützlicheres tun können. Wenn der Test unerwartet abfällt, die Assembly auf dem Continuous Integration Server ausfällt, die Veröffentlichung nicht rechtzeitig erfolgt, das Unternehmen Geld verliert und Sie, der Autor des Tests für heruntergefallene Einheiten, im Extremfall enden. Beim Refactoring verursachen Tests Kopfschmerzen, da sie zu fallen beginnen und Sie damit umgehen müssen.


Trotzdem benötigen böse Bosse mehr Tests, die von der sogenannten "Qualitätskontrolle" sprechen. Besonders listige Manager ziehen sogar die Berichterstattung in Betracht und lassen Sie nicht von der Arbeit gehen, bis sie erreicht ist. Ihr Code wird in eine Überprüfung eingeschlossen, wenn keine Tests darin enthalten sind oder wenn ihnen etwas nicht gefallen hat. Völlig verärgert!


Was tun?


Glücklicherweise gibt es Möglichkeiten, zuverlässige Komponententests zu schreiben, die niemals fehlschlagen. Diese Methoden wurden von mir nicht erfunden, sie werden in einer Reihe von Open-Source-Projekten erfolgreich praktiziert. Alle Beispiele, die ich geben werde, stammen aus echtem Code. Daher gibt es keinen Grund und Sie können nicht nutzen, was bereits von anderen Entwicklern in die Praxis umgesetzt wird!


Der allererste und naheliegendste Weg: Überprüfen Sie im Unit-Test nichts. Hier ist ein einfaches Beispiel :


public void testSetFile() {
    System.out.println("setFile");
    File f = null;
    BlastXMLParser instance = new BlastXMLParser();
    instance.setFile(f);
}

? , , . - , null null'. , .


? :


@Test
public void getParametersTest() {
    List<IGeneratorParameter<?>> parameters = generator.getParameters();
    containsParameterType(parameters, AtomColor.class);
    containsParameterType(parameters, AtomColorer.class);
    containsParameterType(parameters, AtomRadius.class);
    containsParameterType(parameters, ColorByType.class);
    ...
}

, - . containsParameterType:


public <T> boolean containsParameterType(List<IGeneratorParameter<?>> list, Class<T> type) {
    for (IGeneratorParameter<?> item : list) {
        if (item.getClass().getName().equals(type.getName())) return true;
    }
    return false;
}

, ? , . , . !


. , . - . , , , . :


for (int i = 0; i < 0; i++)
{
    Assert.assertTrue(errorProbabilities[i] > 0.0d);
}

0 . . :


List<JavaOperationSignature> sigs = new ArrayList<>();
List<JavaOperationSignature> sigs2 = new ArrayList<>();

for (int i = 0; i < sigs.size(); i++) { //  ,   
    sigs.add(JavaOperationSignature.buildFor(nodes.get(i)));
    sigs2.add(JavaOperationSignature.buildFor(nodes2.get(i)));
}

for (int i = 0; i < sigs.size() - 1; i++) { //  ,  
    assertTrue(sigs.get(i) == sigs.get(i + 1));
    assertTrue(sigs2.get(i) == sigs2.get(i + 1));
}

! , — . .


, , , . , catch. , . , :


try {
    getDs().save(e);
} catch (Exception ex) {
    return; //     !
}

//   ,  -   
Assert.assertFalse("Should have got rejection for dot in field names", true); 
//     
e = getDs().get(e);
Assert.assertEquals("a", e.mymap.get("a.b")); //     !
Assert.assertEquals("b", e.mymap.get("c.e.g"));

, ? ? , . , . , null:


Assert.assertNotNull(new Electronegativity());

new null, . . , , . — :


DocumentImplementation document = new DocumentImplementation(props);
assertNotNull(document.toString().contains(KEY));
assertNotNull(document.toString().contains(VALUE));

boolean Boolean, , , . , , true false. :


Assert.assertNotNull("could not get nr. of eqr: ", afpChain.getNrEQR());

. , , getNrEQR int .


, :


Assert.assertNotNull("Attempt to test atom type which is not defined in the " +
     getAtomTypeListName() + ": " + exception.getMessage());

? , - , - . , null, , .


, , , assertNotNull . ! , assertEquals , :


Assert.assertEquals(ac2.getAtomCount(), ac2.getAtomCount());

, , getAtomCount. - !


double, NaN. , assertNotEquals , . assertTrue:


Assert.assertTrue(result1.get(i) != Double.NaN);

, NaN , , .


assertTrue instanceof-:


Assert.assertNotNull(cf.getRealFormat());
Assert.assertNotNull(cf.getImaginaryFormat());
Assert.assertTrue(cf.getRealFormat() instanceof NumberFormat);
Assert.assertTrue(cf.getImaginaryFormat() instanceof NumberFormat);

getRealFormat getImaginaryFormat NumberFormat, instanceof . . .


, . , assertThat AssertJ (, assertThat(somethingIsTrue()) assertThat(somethingIsTrue()).is(true)). try { ... } catch(Throwable t) {} AssertionError. . , CompletableFuture.runAsync() . , , .


. . . , , . ---!

Source: https://habr.com/ru/post/de434972/


All Articles