
Eugene
20.10.2016
18:18:52
Просто тогда получается, что идеальный тест - это просто прогон вызовов методов с набором входных данных и проверка выходных данных на соответствие ожиданиям

Artem
20.10.2016
18:19:16
Ну, лык а как иначе?) В этом и смысл теста
Зачем тесту знать, как я результата достиг?

Eugene
20.10.2016
18:20:07
Ок, а тогда какой смысл теста, если он проходит только для предопределенного набора входных значений?

Google

Eugene
20.10.2016
18:20:33
Если поведение тестируемого объекта никак не тестируется на корректность, как я могу знать, что тест корректен и для других входных значений?

Artem
20.10.2016
18:21:32

Artem
20.10.2016
18:21:49
А бывают другие тесты? В этом же и смысл, подобрать такие значения, которые проверят корректность кода. Метод, который вычисляет факториал, вы же не проверяет всеми возможными числами?

Eugene
20.10.2016
18:23:11
Для таких атомарных методов - спору нет. Для тестов уровня бизнес-логики надо проверять именно корректность бизнес логики

Artem
20.10.2016
18:23:17
И не залезаете в подробности реализации метода. Может, он там фабрики фабрик создает, нам это неважно

Eugene
20.10.2016
18:24:00
Ок, а если метод ничего не возвращает, а просто дергает void-методы зависимых классов? Тест, получается, совсем не надо писать?

Artem
20.10.2016
18:24:28
Он ведь для какого-то кейса вызывается
Хотя, я вот тут разглагольствую, а сам свой первый юнит-тест позавчера написал. Сильно чуваков с энтерпрайза на ютюбе наслушался.

Eugene
20.10.2016
18:26:57
Я сам в прошлом бэкенд писал на джаве)
Кровавый энтерпрайз, системы документооборота с тяжелыми бизнес процессами
Там этого дерьма употребил огромной ложкой

Google

Eugene
20.10.2016
18:27:42
И юнит-тесты писал, и интеграционные)
Я понимаю, о чем ты говоришь, но все же сам для себя пришел к выводу, что под твои категории должны попадать все же больше интеграционные тесты, нежели юнит
Но это, конечно же, тема для долгих дискуссий и я не претендую на исключительную правоту)

Andre
20.10.2016
18:32:27
Не первый раз вижу синхронизацию через CountDownLatch(1) вместо synchronized(obj). Кто расскажет, есть ли преимущества блокировки защёлкой в плане производительности?

Artem
20.10.2016
18:32:29
В общем, как я понял из слов бородатых мужиков, юнит-тесты - это тесты одного юнита (ваш К.О). Часто юнит - это один класс, но иногда и пара классов, отвечающих за один кейс. Юнит-тест нацелен на проверку этого юнита без внешнего влияния (читай "моки, стабы" и т.п). Детали реализации юнита тесту должны быть нужны по-минимуму. Сегодня я создаю промежуточный объект прямо в методе, а завтра сооружу дворец фабрик. Если тест завязан на уверенность в гвоздями прибитом флоу, это плохо.
Основной профит от тестов должен быть при изменении кола, рефакторинге, чтобы быть уверенному, что ничего не сломалось.
А если ломаются сами тесты, то это время на ветер.

Eugene
20.10.2016
18:35:27
Кстати, при написании теста под реализацию (без фанатизма, конечно же), очень быстро всплывают все неудачные архитектурные решения
И не только архитектурные

Artem
20.10.2016
18:36:39
Я сейчас начал покрывать тестами рабочий полулегаси проект, и это все всплывает и без этого)

Eugene
20.10.2016
18:38:40
Так что я не могу согласиться с тем, что тест должен быть черным ящиком. Да, промежуточные всякие значения нам особо не нужно знать. Но без внутряков никак нельзя обойтись, особенно когда кейс более-менее сложный, а-ля "когда пользователь нажал то-то, записать в базу вот это, отстрелить нотификейшн вот сюда, а в том сервисе обновить то-то и вернуть результат"

Olga Zangieva
20.10.2016
18:40:18
Гайз, ищем android-разработчика в проект https://vc.ru/n/mrg-foodmate

Andre
20.10.2016
18:40:36

Artem
20.10.2016
18:41:06
Так что я не могу согласиться с тем, что тест должен быть черным ящиком. Да, промежуточные всякие значения нам особо не нужно знать. Но без внутряков никак нельзя обойтись, особенно когда кейс более-менее сложный, а-ля "когда пользователь нажал то-то, записать в базу вот это, отстрелить нотификейшн вот сюда, а в том сервисе обновить то-то и вернуть результат"
Не, я ж и не говорю, что надо проверить только "юзер нажал - результат вернулся". Для такого кейса как я вижу текст: "юзер нажал, запись в базу вызвалась, сервис дернулся, нотификейшн как-то показался, результат вернулся"
Эти опорные точки надо проверить, а уж как они достиглись - это неважно
Все, что неважно для кейса (нотификейшн создался ongoing или вообще это тост и подобное) тест не должно интересовать


Валерий
20.10.2016
18:45:53
А если так:
UI:
1 тест: нажалась кнопка - вызвался мок юскейс - вернулся отрицательный результат - отобразилась ошибка
2 тест: нажалась кнопка - вызвался мок юскейс - вернулся положительный результат - отобразились данные
BL:
3 тест: юскейс с мок репозиторием возвращающим ошибку
4 тест: юскейс с мок репозиторием возвращающим успех
...

Andre
20.10.2016
18:46:33
лучший юнит-тест — это Настя

Валерий
20.10.2016
18:47:21
+
Но проблема с рефакторингом, при изменении кода считающегося стабильным

Google

Artem
20.10.2016
18:47:48
А если проверка, попросил ли презентер показать ошибку, то проблем не вижу

Валерий
20.10.2016
18:49:52
А UI тесты вообще нужны?

Andre
20.10.2016
18:50:12

Artem
20.10.2016
18:50:36
Как бы нет или не очень, но это уже другая тема
Хотя ечпрессо тест раннер удобная штука для верстки, наверное - записал действия, поправил что-то, повторил до просветления.

Alexander
20.10.2016
18:52:30
Всем привет. Кто то юзал https://github.com/Arello-Mobile/Moxy в продакшин ? Поделитесь опытом

Eugene
20.10.2016
18:52:52
просто если у тебя в интерфейсе есть два метода, делающие одно и то ж разными способами - наверное есть смысл проверить внутряки)

Artem
20.10.2016
18:54:01

Валерий
20.10.2016
18:54:12
Ну в идеале да) Но мне кажется в первую очередь нужно проверить сами интерфейсы

Artem
20.10.2016
18:55:10

Eugene
20.10.2016
18:55:37
для меня два разных метода в интерфейсе - это два разных метода. Реализация всегда может сильно поменяться, поэтому надо проверять корректность передачи управления тому или иному методу вьюхи

Валерий
20.10.2016
18:57:35
Может я не понял, но вроде как "делающие одно и то же" - это интерфейс, а " разными способами" - его имплементации

Artem
20.10.2016
19:02:31

Eugene
20.10.2016
19:07:09

Валерий
20.10.2016
19:08:39

Artem
20.10.2016
19:09:20
А как по мне, то 2 перегруженные методы, делающие абсолютно разные вещи - намного печальнее. И если мне тест на это покажет, я скажу ему спасибо)

Roman
20.10.2016
19:11:30

Google

Andre
20.10.2016
19:13:17

Roman
20.10.2016
19:14:11

Andre
20.10.2016
19:14:37
Впрочем, мы точно так же можем wait/notifyAll использовать

Roman
20.10.2016
19:15:25
у них есть область пересечения сфер применения, но в общем разное назначение

Andre
20.10.2016
19:17:09

Admin
ERROR: S client not available

Andre
20.10.2016
19:17:44
я бы, конечно, изучил как читать байткод и какие операции сколько выполняются, но ради одной этой задачи жирновато

Roman
20.10.2016
19:17:48

Alexandr
20.10.2016
19:18:07

Eugene
20.10.2016
19:21:31
Вероятнее всего, потому что на классах из библиотеки намного проще построить значительно более читабельный и внятный код)
А то иногда понатыкают wait и notify, а потом разбираешься и пытаешься понять, а как вообще предполагалось, что это должно работать? =)

Dmitry
20.10.2016
19:23:27
есть более быстрые и удобные аналоги синхронизации, чем wait/notify
это если легаси - то да

Alexandr
20.10.2016
19:25:13

Dmitry
20.10.2016
19:26:16
нет не библиотеки, из java.util.concurrent пакета

Eugene
20.10.2016
19:27:08
Это уже детали)

Google

Andre
20.10.2016
19:27:23

Dmitry
20.10.2016
19:29:12
ага

Eugene
20.10.2016
19:29:25
Так-то пакет concurrency входит в JCL

Andre
20.10.2016
19:29:32
окей, а есть сравнения производительности wait/notify и synchronized с java.util.concurrent.locks?

Dmitry
20.10.2016
19:31:53
не знаю, я не искал, но из описания как работает ReentrantLock например, делаю вывод что оно не хило оптимизируется в процессе выполнения
наврядли wait/notify это могут
может я не прав)не буду утверждать 100%)

Denis
20.10.2016
19:34:35
Какие проблемы в андроид разработке, в приложении RxJava помогает решить?

Dmitry
20.10.2016
19:34:37
опять же правда оговорка, все зависит от задачи, сколько потоков и как часто борятся на ресурсы

Eugene
20.10.2016
19:35:15

Dmitry
20.10.2016
19:40:51
вообще лучше юзать CAS если мало поточное приложение

Andre
20.10.2016
19:41:49
как бы мы не хотели, но там вроде как от спинлока не избавиться же

Denis
20.10.2016
19:42:57

Eugene
20.10.2016
19:46:37
Вполне)

Seraphim
20.10.2016
19:48:42

Masha
20.10.2016
19:49:06
Rx — топчик

Eugene
20.10.2016
19:49:44
Если не было опыта - советую чисто для себя наваять песочницу и посмотреть. Желательно, чтобы были запросы к апишке, кэширование в базу и т.д. и т.п.