كيف تكتب اختبارات الوحدة إذا كنت لا ترغب في ذلك على الإطلاق

بين الحين والآخر في العمل ، يحاولون إجبارنا على كتابة اختبارات الوحدة. لقد أدرك الكثيرون بالفعل أنهم يؤذون ضررًا واحدًا. تستغرق اختبارات الكتابة الكثير من الوقت ، حيث يمكنك القيام بشيء أكثر فائدة. إذا بدأ الاختبار في الانخفاض بشكل غير متوقع ، تنهار التجميع على خادم التكامل المستمر ، فلا يتم طرح الإصدار في الوقت المحدد ، ويفقد العمل المال وأنت ، مؤلف اختبار الوحدة الساقطة ، ينتهي بك الأمر في النهاية. عند إعادة البناء ، تتسبب الاختبارات في حدوث صداع لأنها تبدأ في السقوط وعليك التعامل معها.


ومع ذلك ، يحتاج الرؤساء الشريرون إلى مزيد من الاختبارات ، ويتحدثون عن ما يسمى "مراقبة الجودة". لا سيما المديرين الماكرة حتى النظر في التغطية وعدم السماح لك بالرحيل عن العمل حتى يتم تحقيق ذلك. يتم لف الكود الخاص بك في مراجعة إذا لم تكن هناك اختبارات في ذلك أو إذا لم يعجبهم شيء. مفاجأة كاملة!


ماذا تفعل؟


لحسن الحظ ، هناك طرق لكتابة اختبارات الوحدات الموثوقة التي لا تفشل أبدًا. لم أخترع هذه الطرق من قِبلي ، حيث تمارس بنجاح في عدد من المشاريع مفتوحة المصدر. جميع الأمثلة التي سأقدمها مأخوذة من كود حقيقي. لذلك ، لا يوجد سبب ولا يمكنك الاستفادة مما يطبق بالفعل من قبل المطورين الآخرين!


الطريقة الأولى والواضحة للغاية: لا تحقق أي شيء في اختبار الوحدة. هنا مثال بسيط :


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


All Articles