LINUX.ORG.RU

[юнит-тестирование] Как проверить, что программа уходит в фон или не уходит в него по указке


0

2

Решил один проектик построить полностью по TDD. Не то чтобы это религия или панацея, но и 100% покрытия — не хвост собачий.

Частью этого проектика является небольшая обертка для написания аппликаций, ну там init-run-done. По ключу нужно, чтобы программа выполнялась как демон, либо наоборот, оставалась привязанной к терминалу.

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

Интересуют подходы как извне, так и изнутри.

★★★★★

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

val-amart ★★★★★
()

Кстати о гуру ТДД.

Скастовать сюда бы baverman. Проект-то на питоне, использует python-daemon для демонизации.

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

Это уже функциональное тестирование. И нужность этого теста несколько сомнительна, так как код для поднятия окружения и проверки корректности будет сильно больше самой обертки, причем, если схалтурить, то вся эта конструкция будет еще и хрупкой.

Но если бы делал я, то предусмотрел передачу фиктивного параметра, по которому демон можно было бы идентифицировать в списке процессов, а там уже pgrep. И собственно все, программа стартовала, терминал отдала, процесс есть — значит демон.

Можно пойти еще дальше, в демоне обрабатывать какой-нибудь ненужный сигнал (USR1, USR2), а изнутри уже гораздо легче определить правильно задемонизировался процесс или нет (кто родитель, есть ли терминал, куда смотрят ввод/вывод) и сбрасывать эту инфу в определенное место.

Или, если интересны только линуксы, можно просто шерстить /proc.

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

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

Что-то я загнал. Делается маленький сервер, слушающий пайп, с помощью которого обертка легко и непринужденно проверяется на работоспособность.

baverman ★★★
()

Как проверить, что программа уходит в фон или не уходит в него по указке

тебе надо создать при помощи mock чучелко из куска кода, который реально занимается уводом в фон твоей программы, подсунуть это чучелко своему куску программы и послушать что от твоей программы прилетает - если правильно (с правильными параметрами и в нужной последовательности) всё вызываются - гуд, нет - кричи караул

для mock'ов мне больше нравится pymox

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

Делается маленький сервер, слушающий пайп, с помощью которого обертка легко и непринужденно проверяется на работоспособность.

не TDD

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

не TDD

А это и не должно быть им. Здесь надо не логику проверять, а состояние внешнего мира, поэтому моками не обойдешься.

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

> не TDD

А это и не должно быть им.

Решил один проектик построить полностью по TDD.

?

Здесь надо не логику проверять, а состояние внешнего мира, поэтому моками не обойдешься.

тогда это уже не модульное тестирование

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

сначала всегда тест, и только потом код.

Как заметил, shty, можно подсунуть мок. Но тогда непонятно, что вообще тестируется. Одной из особенностей TDD, является возможность подменить имплементацию без ущерба для тестов. И TDD хорошо работает, когда тестовое окружение минимально или его вообще нет.

Здесь нам конкретно надо проверить, поднялся процесс или нет. О того что тест напишется первым, ни холодно ни жарко.

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

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

Надо убедиться в том, что реакция на ключ --daemon правильная.
Пока что думаю в сторону процесса, который садится на юниксовый сокет и отдает в него что-то. Нужно запустить процесс как демон и убедиться, что он откликается на позывные и (отдельно) его pid-файл лежит там, где ему сказали лечь.

Можно еще подделать модуль daemon и проверить, что происходит вход в контекст и что контексту переданы правильные параметры.

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