juan_gandhi: (Default)
[personal profile] juan_gandhi
 So, if you think you call a function in your code, and this function returns current time, or a random number... IT'S NOT A FUNCTION. Your code is function of "random number", or "time".

So, if your code is written as something that retrieves this kind of data, to test your code, you should provide that data. Not just today, but try the time, like 10 years from now. As to "random", You provide the randomness. If your code cannot be fixed to behave as a function of those inputs, make your "random stream" or "time stream" not hard-coded, but substitutable. Mockable. And mock it in your tests. MAKE SURE that you don't provide just happy-path data. Provide anything. A sequence of 100 numbers 4 for random. Time that is 10 years from now. Or even 30 yeas from now.

Make sure that your tests don't depend on anything. Because test Must Be Reproducible.

All these things, I know, are obvious to some, and not obvious to others.

If you still have questions, ask. But don't argue. Because what I say is math. Unless you have another math (some people do), or another logic (there's plenty of them), please don't argue.

I'd be glad to see how all this changes if logic is e.g. linear. 

 

Re: What to test in time-dependent function?

Date: 2020-08-24 10:44 pm (UTC)
From: [personal profile] mikkim08
Но такие предположения "о структуре сервиса в целом" - гораздо менее надежные, чем предположения по структуре TimeToGreeting.

Отнюдь. Весь сервис ненамного сложнее TimeToGreeting.

Например потому, что при изменении списка возвращаемых значений, наши тесты, которые опираются на эти значения - тоже придется менять.

Мне это не кажется большим недостатком. Особенно в сравнении с тем, что зато мы покрываем тестами весь сервис.
Edited Date: 2020-08-24 10:46 pm (UTC)

Re: What to test in time-dependent function?

Date: 2020-08-24 11:22 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> Весь сервис ненамного сложнее TimeToGreeting.

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

> Мне это не кажется большим недостатком.

Необходимость изменять данные в двух местах - отнимает дополнительное время и создает существенные проблемы.

> зато мы покрываем тестами весь сервис

Так ведь не покрываем весь сервис.
Потому что мы тестируем mocks, а не полный оригинальный сервис.

Re: What to test in time-dependent function?

Date: 2020-08-25 05:30 am (UTC)
From: [personal profile] mikkim08
И есть еще риск того, что сервис станет сложнее в будущем.

То же самое можно сказать и о функции TimeToGreeting.

Необходимость изменять данные в двух местах - отнимает дополнительное время и создает существенные проблемы.

В двух местах это в смысле и в имплементации сервиса, и в тестах для него ?

Так ведь не покрываем весь сервис. Потому что мы тестируем mocks, а не полный оригинальный сервис.

Это Ваше предположение, но мы этого пока не знаем, т.к. ещё не обсуждали, как имплементировать сервис и mocks.
Edited Date: 2020-08-25 06:19 am (UTC)

Re: What to test in time-dependent function?

Date: 2020-08-25 03:31 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
>> риск того, что сервис станет сложнее в будущем.

> То же самое можно сказать и о функции TimeToGreeting.

Да, но риск от усложнения функции TimeToGreeting, которая напрямую покрыта юнит тестами -- меньше. Потому что:
1) Меньше потенциального шума между тестами и функцией TimeToGreeting.
2) Наличие тестов у функции TimeToGreeting более очевидно.
3) Принадлежность тестов к функции TimeToGreeting - более очевидна.

Re: What to test in time-dependent function?

Date: 2020-08-25 03:36 pm (UTC)
From: [personal profile] mikkim08
Тогда, наверное, нужно стремиться к тому, чтобы риск от усложнения всего сервиса был не больше чем риск от усложнения функции TimeToGreeting. Я думаю, это можно сделать.

Re: What to test in time-dependent function?

Date: 2020-08-25 03:48 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> нужно стремиться к тому, чтобы риск от усложнения всего сервиса был не больше чем риск от усложнения функции TimeToGreeting.

Это какая-то странная цель.

Если я очень сильно увеличу риск от усложнения функции TimeToGreeting, то ваша цель вполне может быть достигнута, верно?
Но непонятно, зачем нужно достигать такую странную цель.

Re: What to test in time-dependent function?

Date: 2020-08-25 08:09 pm (UTC)
From: [personal profile] mikkim08
Конечно, хотелось бы снизить риск от усложнения сервиса, а не увеличить риск от усложнения функции TimeToGreeting.

Multiple separate places to modify code

Date: 2020-08-25 03:36 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
>> Необходимость изменять данные в двух местах - отнимает дополнительное время и создает существенные проблемы.

> В двух местах это в смысле и в имплементации сервиса, и в тестах для него ?

Да.
Не так уж и важно что это за два места. Проблематично, что таких мест - больше одного.

Re: Multiple separate places to modify code

Date: 2020-08-25 03:38 pm (UTC)
From: [personal profile] mikkim08
Мне кажется это естественным. Если меняются требования, то нужно переделывать и тесты, и сам сервис.

Re: Multiple separate places to modify code

Date: 2020-08-25 03:50 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> Если меняются требования, то нужно переделывать и тесты, и сам сервис.

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

Re: Multiple separate places to modify code

Date: 2020-08-25 08:12 pm (UTC)
From: [personal profile] mikkim08
Бывает, конечно, по-разному, и "хрупкие" тесты, которые нужно всё время переделывать, я тоже не люблю, но в целом тот факт, что при изменении требований нужно переделывать и сервис, и тесты, меня не очень заботит.

Re: Multiple separate places to modify code

Date: 2020-08-25 08:21 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> что при изменении требований нужно переделывать и сервис, и тесты, меня не очень заботит.

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

Re: Multiple separate places to modify code

Date: 2020-08-26 08:02 pm (UTC)
From: [personal profile] mikkim08
Видимо, тут имеет место компромисс между количеством тестов и накладными расходами на их поддержку. Выбор тут, наверное, зависит от многих разных факторов, в том числе субъективных. Но я могу себе представить ситуации, когда лучше написать побольше тестов несмотря на затраты по их сопровождению чем наоборот.

Потому что можно же одно из мест упустить из виду. Тесты, обычно, помогают самодиагностироваться, но не всегда.

Я не знаю, что конкретно имеется в виду, но тесты, наверное, нужно писать так, чтобы они помогали самодиагностироваться всегда.

Re: Multiple separate places to modify code

Date: 2020-08-26 08:09 pm (UTC)
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> могу себе представить ситуации, когда лучше написать побольше тестов несмотря на затраты по их сопровождению

Да, бывает и так.

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

Это невозможно.
Тем более, что самодиагностика - это лишь второстепенная цель тестов.
Основная цель тестов - диагностировать production code.

Re: Multiple separate places to modify code

Date: 2020-08-26 08:12 pm (UTC)
From: [personal profile] mikkim08
Возможно, я не понял, что значит самодиагностика и для чего она. Можете привести пример ?

Tests self-diagnostic

From: [personal profile] dennisgorelik - Date: 2020-08-26 08:20 pm (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] mikkim08 - Date: 2020-08-27 08:11 pm (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] dennisgorelik - Date: 2020-08-27 11:35 pm (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] dennisgorelik - Date: 2020-08-28 12:19 am (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] dennisgorelik - Date: 2020-08-28 08:48 am (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] mikkim08 - Date: 2020-08-28 07:57 pm (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] dennisgorelik - Date: 2020-08-29 12:52 am (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] mikkim08 - Date: 2020-08-29 08:33 pm (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] dennisgorelik - Date: 2020-08-29 09:52 pm (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] mikkim08 - Date: 2020-08-30 05:12 pm (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] sassa_nf - Date: 2020-08-29 08:12 am (UTC) - Expand

Re: Tests self-diagnostic

From: [personal profile] mikkim08 - Date: 2020-08-29 08:35 pm (UTC) - Expand
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> ещё не обсуждали, как имплементировать сервис и mocks.

Если при тестировании с помощью mocks, в тестах приходится делать какие-то дополнительные операции, которые не делаются в production code, то такое тестирование с помощью mocks -- не покрывает весь сервис.
В частности, не покрыта та часть, которая делает то же, что делают тесты, манипулируя mocks.
From: [personal profile] mikkim08
Тут я уже запутался. В особенности из-за последней фразы.
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
Mock тестирование - не просто передает параметры в тестируемую функцию, но и делает дополнительные операции (обычно устанавливает значения некоторых properties у mock объекта), верно?

Аналоги этих дополнительных операций -- выполняются и при регулярном выполнении production code, верно?

Так вот эти аналоги (части production code) -- не покрыты mock тестами.
То есть покрытие неполное.
From: [personal profile] mikkim08
Я не вполне согласен.

Представьте, что в код, который исполняет new DateTime(), передаёся какой-нибудь DateTimeCreator с методом newDateTime(), и все вызовы new DateTime() меняются на вызовы newDateTime().

Теперь в production мы передаём одну имплементацию DateTimeCreator, а в тестах -- другую (я называю её, возможно ошибочно, mock). Я не вижу тут неполного покрытия.
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
У вас получилось хорошее описание примера использования mock.

> в production мы передаём одну имплементацию DateTimeCreator,

Так вот эта "production" имплементация -- и не тестируется.
И процесс передачи этой "production" имплементации -- тоже не тестируется.

Это и делает тестовое покрытие с помощью mocks - неполным.

Признаки непонимания

From: [personal profile] dennisgorelik - Date: 2020-08-26 11:37 pm (UTC) - Expand

Re: Признаки непонимания

From: [personal profile] dennisgorelik - Date: 2020-08-27 04:56 pm (UTC) - Expand

Re: Признаки непонимания

From: [personal profile] dennisgorelik - Date: 2020-08-27 11:29 pm (UTC) - Expand

Re: Признаки непонимания

From: [personal profile] dennisgorelik - Date: 2020-08-28 12:21 am (UTC) - Expand

Re: Признаки непонимания

From: [personal profile] dennisgorelik - Date: 2020-08-28 08:30 am (UTC) - Expand
From: [personal profile] mikkim08
DateTimeCreator можно тоже покрыть тестами.
Процесс его передачи, наверное, тоже.
dennisgorelik: 2020-06-13 in my home office (Default)
From: [personal profile] dennisgorelik
> DateTimeCreator можно тоже покрыть тестами.

Если можно покрыть тестами DateTimeCreator, то зачем нужен Mock, подменяющий DateTimeCreator?

> Процесс его передачи, наверное, тоже.

Можно. В полноценном integration тесте, который не использует Mock.

Profile

juan_gandhi: (Default)
Juan-Carlos Gandhi

May 2025

S M T W T F S
    1 2 3
456 7 8 9 10
11 121314151617
181920 21 222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 23rd, 2025 09:51 am
Powered by Dreamwidth Studios