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()
. , , .
. . . , , . ---!