Cara menulis unit test jika Anda tidak menyukainya sama sekali

Sesekali di tempat kerja, mereka mencoba memaksa kami untuk menulis tes unit. Banyak yang sudah menyadari bahwa mereka melakukan satu bahaya. Tes menulis membutuhkan banyak waktu, sehingga Anda bisa melakukan sesuatu yang lebih bermanfaat. Jika tes tiba-tiba mulai jatuh, perakitan rusak pada server integrasi berkelanjutan, rilis tidak keluar tepat waktu, bisnis kehilangan uang dan Anda, penulis unit test yang jatuh, berakhir di ekstrem. Ketika refactoring, tes menyebabkan sakit kepala karena mereka mulai jatuh dan Anda harus mengatasinya.


Namun demikian, bos jahat memerlukan lebih banyak tes, berbicara tentang apa yang disebut "kontrol kualitas". Terutama manajer yang licik bahkan mempertimbangkan cakupan dan tidak membiarkan Anda pergi kerja sampai tercapai. Kode Anda dibungkus dalam ulasan jika tidak ada tes di dalamnya atau jika mereka tidak menyukai sesuatu. Benar-benar kesal!


Apa yang harus dilakukan


Untungnya, ada cara untuk menulis unit test yang andal yang tidak pernah gagal. Metode ini tidak ditemukan oleh saya, mereka berhasil dipraktekkan di sejumlah proyek open source. Semua contoh yang akan saya berikan diambil dari kode nyata. Oleh karena itu, tidak ada alasan dan Anda tidak dapat mengambil keuntungan dari apa yang sudah dipraktikkan oleh pengembang lain!


Cara pertama dan jelas: jangan memeriksa apa pun di unit test. Ini adalah contoh sederhana :


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


All Articles