Como escrever testes de unidade, se você não quiser

De vez em quando no trabalho, eles tentam nos forçar a escrever testes de unidade. Muitos já perceberam que causam um dano. Escrever testes leva muito tempo, pelo qual você pode fazer algo mais útil. Se o teste começar a cair inesperadamente, o assembly será interrompido no servidor de integração contínua, a versão não será lançada com o tempo, a empresa perderá dinheiro e você, o autor do teste de unidade caído, acabará no extremo. Ao refatorar, os testes causam dor de cabeça porque começam a cair e você precisa lidar com isso.


No entanto, chefes do mal exigem mais testes, falando sobre o chamado "controle de qualidade". Os gerentes particularmente astutos consideram a cobertura e não o deixam trabalhar até que seja alcançado. Seu código é agrupado em uma revisão se não houver testes ou se eles não gostaram de algo. Chateado completo!


O que fazer?


Felizmente, existem maneiras de escrever testes de unidade confiáveis ​​que nunca falham. Esses métodos não foram inventados por mim; eles são praticados com sucesso em vários projetos de código aberto. Todos os exemplos que darei são retirados do código real. Portanto, não há motivo e você não pode tirar proveito do que já está sendo colocado em prática por outros desenvolvedores!


A primeira e óbvia maneira: não verifique nada no teste de unidade. Aqui está um exemplo simples :


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


All Articles