Вопрос по unit-tests
От: strannik747  
Дата: 31.05.12 07:23
Оценка:
Имеется такой код (Java):

class ClassName {
    
    private int _field1;
    ...

    ClassName(int f1) {
        _field1 = f1;   
    }
    
    int calcSomething(int cnt) {
        return Utils.trunc(cnt * _field1 / 100 + 1);
    }
}



Какой unit-test имеет смысл писать для метода calcSomething(), если мы хотим проверить нормальное расчетное поведение, а не граничные случаи?

1) res[] расчитаны вручную по формуле, но непонятно, что они означают

@Test 
void calcSomething() {
    final int INIT_VAL = 1234;
    ClassName obj = new ClassName(INIT_VAL);
    int[] cnt = {0, 1, 3, 17, 1024};
    int[] res = {1, 13, 38, 210, 12637}; 
    for (int i=0; i < cnt.length; ++i) {
        assertThat(obj.calcSomething(cnt[i]), is(res[i]));
    }
}



2) Показана формула расчета, но это полное дублирование кода метода!
@Test 
void calcSomething() {
    final int INIT_VAL = 1234;
    ClassName obj = new ClassName(INIT_VAL);
    int[] cnt = {0, 1, 3, 17, 1024};
    for (int i=0; i < cnt.length; ++i) {
        assertThat(obj.calcSomething(cnt[i]), 
            is(Utils.trunc(cnt[i] * INIT_VAL / 100 + 1)));
    }
}
unit test java
Re: Вопрос по unit-tests
От: andrey82  
Дата: 31.05.12 07:41
Оценка:
Здравствуйте, strannik747, Вы писали:

S>Имеется такой код (Java):



S>Какой unit-test имеет смысл писать для метода calcSomething(), если мы хотим проверить нормальное расчетное поведение, а не граничные случаи?


S>1) res[] расчитаны вручную по формуле, но непонятно, что они означают

Вполне нормально. Смысл значений можно в комментариях указать.

S>2) Показана формула расчета, но это полное дублирование кода метода!

Получается просто проверка присвоения значения полю класса. Дублирование кода смысла не имеет.

Я бы вынес саму формулу (return Utils.trunc(par1 * par2 / 100 + 1)) в статический метод и проверял бы ее отдельно.
Re[2]: Вопрос по unit-tests
От: strannik747  
Дата: 31.05.12 10:44
Оценка:
Здравствуйте, andrey82:

Спасибо за ответ. Поясню, в чем смысл затруднений.

S>>1) res[] расчитаны вручную по формуле, но непонятно, что они означают

A>Вполне нормально. Смысл значений можно в комментариях указать.

Так и делаю. Но смысла в этих цифирках нет никакого: клиент дал формулу, я посчитал несколько значений, клиент с ними согласился. То есть для меня, как программиста, этот юнит-тест ничего не поясняет, только демонстрирует правильность расчета нескольких значений.

A>Я бы вынес саму формулу (return Utils.trunc(par1 * par2 / 100 + 1)) в статический метод и проверял бы ее отдельно.


Проблема 1) придумывание нового говорящего имени для метода
Проблема 2) видимость его должен быть, как минимум, уровня пакета, чтобы тестировать (необходимость тестирования private-методов говорит о проблемах в дизайне), это делает его видимым для других классов в пакете
Проблема 3) в данном классе уже около 15 методов (все повязаны с 3-мя параметрами класса), причем 5 из них такие вот однострочные, вводить еще 5 статических методов как-то некрасиво
Re: Вопрос по unit-tests
От: . Великобритания  
Дата: 31.05.12 20:41
Оценка:
Здравствуйте, strannik747, Вы писали:

s> 1) res[] расчитаны вручную по формуле, но непонятно, что они означают

Имхо это. Плюс ссылка на описание откуда взято и что значит.
avalon 1.0rc3 rev 0, zlib 1.2.3.4
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Вопрос по unit-tests
От: Буравчик Россия  
Дата: 02.07.12 08:10
Оценка:
Здравствуйте, strannik747, Вы писали:

S>Имеется такой код (Java):


Utils.trunc(cnt * _field1 / 100 + 1)

Небольшой code review: этот код похож на вычисление целой доли от числа cnt. При этом доля выражена процентах (значение в процентах хранится в _field1).

Если это так, то функция будет работать неправильно при cnt=1000 _filed1=10.
Best regards, Буравчик
Re: Вопрос по unit-tests
От: jazzer Россия Skype: enerjazzer
Дата: 02.07.12 08:25
Оценка:
Здравствуйте, strannik747, Вы писали:

S>1) res[] расчитаны вручную по формуле, но непонятно, что они означают


только этот.

S>2) Показана формула расчета, но это полное дублирование кода метода!


Ты что хочешь проверить? Что алгоритм правильно работает? Очевидно, ты не можешь его проверить повторной реализацией. Обязательно нужен какой-то другой способ проверки — либо другой алгоритм, либо, что самое простое (и наименее подвержено ошибкам), если известны численные ответы — эти самые ответы.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.