Comment écrire des tests unitaires si vous n'en avez pas envie du tout

De temps en temps au travail, ils essaient de nous forcer à écrire des tests unitaires. Beaucoup ont déjà réalisé qu’ils faisaient un mal. L'écriture des tests prend beaucoup de temps, pour laquelle vous pourriez faire quelque chose de plus utile. Si le test commence à tomber de façon inattendue, l'assemblage tombe en panne sur le serveur d'intégration continue, la version ne se déroule pas à temps, l'entreprise perd de l'argent et vous, l'auteur du test unitaire tombé, vous retrouvez à l'extrême. Lors de la refactorisation, les tests provoquent un mal de tête car ils commencent à tomber et vous devez y faire face.


Néanmoins, les méchants patrons nécessitent plus de tests, en parlant du soi-disant "contrôle qualité". Les gestionnaires particulièrement rusés envisagent même la couverture et ne vous laissent pas partir jusqu'à ce qu'elle soit atteinte. Votre code est encapsulé dans un examen s'il ne contient aucun test ou s'il n'a pas aimé quelque chose. Bouleversement complet!


Que faire?


Heureusement, il existe des moyens d'écrire des tests unitaires fiables qui n'échouent jamais. Ces méthodes n'ont pas été inventées par moi, elles sont pratiquées avec succès dans un certain nombre de projets open source. Tous les exemples que je donnerai sont tirés du vrai code. Par conséquent, il n'y a aucune raison et vous ne pouvez pas profiter de ce qui est déjà mis en pratique par d'autres développeurs!


La toute première manière évidente: ne rien vérifier dans le test unitaire. Voici un exemple simple :


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/fr434972/


All Articles