LINUX.ORG.RU

Change detection тесты.

 , , ,


0

1

Узнал о таком забавном антипаттерне и интересном его описании. Все на поверхности, но на практике такие тесты таки всплывают. Вот код

int add(int a, int b){
  return a+b;
}

Представим такой дебильный тест на несуществующем фреймворке

assertEquals(add_code, 
  "int add(int a, int b){"+
  "  return a+b;"+
  "}");

Несмотря на отличный test coverage, покрытие всех возможных сценариев, подробное описание поведения функции, этот тест идиотский более чем полностью и ничего полезного не тестирует. Более того, если поменять код add даже безобидно, добавив логгирование, то тест упадет и его нужно будет править. Он по сути упадет при любом изменении гарантировано.

Так вот, к чему я веду. Мы все часто пользуемся mocks. Вот более реалистичный код.

void myFunction(MyObject obj, MyOtherObject obj2){
   int x = obj.doSomething();
   obj2.doSomethingElse(x);
}

И тест

MyObject o = mock(MyObject.class);
MyOtherObject o2 = mock(MyOtherObject.class);

validate(o.doSomething()).return(2);
validate(o2.doSomethingElse(2));

myFunction(o, o2);

А если посмотреть правде в глаза - ни верхний дебильный тест и этот по сути ничем не отличаются.

Такие дела. Мораль истории - не пишите такие тесты если не уверены на точно что в данном случае так и надо. Нужно пытаться проверять только точно желаемые вызовы и избегать влезания в реализацию в тесте

Всем спасибо, я все сказал.

★★★★★

Последнее исправление: vertexua (всего исправлений: 5)
Ответ на: комментарий от vertexua

Не пиши такие валидации моков, которые просто дублируют код

Это и ежу очевидно, зачем об этом вообще писать?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Ежу понятно если его спросить. А вот когда код писать, то он пишет такие тесты очень часто

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

А как тогда протестировать код второго примера (что ты не забыл вызывать метод obj2.doSomethingElse(x)) ?

anonymous
()
Ответ на: комментарий от anonymous

Нужно сначала подумать, нужно ли тебе тестировать именно это. Если да, тогда ок, если нет то перепиши

vertexua ★★★★★
() автор топика

если поменять код add даже безобидно, добавив логгирование, то тест упадет

верхний дебильный тест и этот по сути ничем не отличаются

То есть, нижний тест ТОЖЕ упадёт, если добавить в add логирование?

Miguel ★★★★★
()

Mock hell штука известная. Но какая альтернатива? Можо делать фейки, но это дорого. Можно делать стабы, но это дает маленькое покрытие. Моки - быстро, дает хорошее покрытие и легко ломается при тривиальном рефакторинге. Истина где-то посредине с использованием всевозможных подходов в нужной пропорции.

dizza ★★★★★
()
Последнее исправление: dizza (всего исправлений: 1)

пиши на аде

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.