مسیر فایل: scripts/run_tests_in_docker.sh
راهنمای تکمیلی (انگلیسی): docs/docker-tests.md
۱. کاراییش به زبان ساده
یک استک تست جدا از استک live/production بالا میآورد (Postgres، Kafka، app-api)، منتظر آمادگیشان میماند، سپس تمام سرویسهای *-tests با پروفایل Composeی test را یکییکی اجرا میکند، جدول خلاصهٔ PASS / FAIL / SKIPPED چاپ میکند، و در پایان (بهصورت پیشفرض) همان استک تست را با volumeهایش پایین میآورد. به root .env، volumeهای live، و کانتینرهایی مثل project_postgres دست نمیزند.
۲. کجا در پروژه کلی استفاده میشود؟
- راه استاندارد اجرای «همهٔ سوئیتهای زیرسیستم» روی ماشین developer یا CI.
- متصل به سرویسهای
*-testsدرdocker-compose.yml(پروفایلtest) بههمراه override ایزولهسازی درdocker-compose.test.yml. - مکمل تست unit محلی؛ اینجا تمرکز روی شبکهٔ Compose و integration واقعی در محیط disposable است.
- اختیاری در Ansible: با
run_tests_before_deploy=trueقبل ازbring_up.shروی سرور (پیشفرض خاموش). جزئیات:ansible/README.md. - نه جایگزین healthcheck استک live — آنجا
bring_up.sh+check_infra.shکافی است.
۳. ایزولهسازی از استک live (رویکرد جدید)
قبلاً اسکریپت همان پروژهٔ Compose و همان .env ریشه را لمس میکرد و میتوانست به دادهٔ واقعی بنویسد. الان سه قطعه همیشه با هم استفاده میشوند:
| قطعه | نقش |
|---|---|
COMPOSE_PROJECT_NAME=playpulse_test(فلگ -p playpulse_test) |
شبکه و volume جدا (مثلاً playpulse_test_postgres_data)؛ موازی با استک live روی یک ماشین ممکن است. |
.env.test |
جایگزین متغیرها فقط برای استک تست — نه root .env که bring_up / Ansible استفاده میکند. از .env.test.example کپی کنید (gitignore شده). |
docker-compose.test.yml |
container_name ثابتها (مثل project_postgres) و پورتهای publishشده روی host را پاک میکند تا با استک live برخورد نکند؛ restart: "no". |
تعریف سرویسها همان docker-compose.yml است؛ کپی دوم از کل استک یا Testcontainers لازم نیست.
۴. چیکارا میکند؟ (جریان اجرا از اول تا آخر)
- پیشنیاز: وجود
docker-compose.ymlوdocker-compose.test.yml. اگر.env.testنباشد، یکبار از.env.test.exampleساخته میشود (هرگز overwrite نمیکند). - دستور Compose ثابت:
docker compose -p playpulse_test --env-file .env.test -f docker-compose.yml -f docker-compose.test.yml - زیرساخت تست:
up -dبرایpostgres،zookeeper،kafka،app-api؛ سپسkafka-initبا--force-recreateتا topicها ساخته شوند. - Wait: آمادگی Postgres، Kafka، خروج موفق kafka-init، healthy بودن app-api — همه از طریق همان پروژهٔ
playpulse_test(نه نامهای live). - از این نقطه: trap روی EXIT فعال است تا در پایان (یا abort) استک تست پاک شود مگر
--keep. - سوئیتها بهترتیب (شکست یکی بقیه را قطع نمیکند):
app-api-testscrawler-testsوcrawler-tests-live(بخش Play Store اینترنت خروجی میخواهد)network-analyzer-tests،-live،-oracle(oracle به tshark /Dockerfile.test)storage-consumer-testsو-integrationsentiment-testsو-integration(اگرplaypulse-sentiment:latestنباشد → SKIPPED؛ cold-build نمیکند)
- هر سوئیت با
compose --profile test run --rmروی همان شبکهٔ تست اجرا میشود؛ خروجی tee میشود و برچسب میگیرد. - خلاصه PASS/FAIL/SKIPPED چاپ میشود.
- Teardown خودکار: مگر با
--keep، کانتینرها و volumeهایplaypulse_testحذف میشوند. exit code بر اساس FAIL واقعی است (SKIPPED کل run را قرمز نمیکند).
برچسبهای خلاصه:
| برچسب | معنا |
|---|---|
| PASS | سوئیت با exit 0 تمام شد. |
| FAIL | شکست واقعی تست/اجرا. |
| SKIPPED | پیشنیاز خارجی: اینترنت برای Play Store فقط در crawler-tests-live؛ tshark برای oracle؛ یا نبود image مربوط به sentiment. network-analyzer-tests-live فقط Kafka/App API روی شبکهٔ Compose است و برای «نبود اینترنت» SKIPPED نمیشود. |
۵. تصمیمات معماری
- ایزوله بهجای Testcontainers: همان Compose پروژه حفظ میشود؛ فقط پروژه/env/override جدا — سادهتر و همشکل production.
- عدم لمس دادهٔ live: integrationها فقط روی Postgres/Kafka تست مینویسند؛ بعد از run پیشفرض همه پاک میشود.
- Teardown پیشفرض +
--keep: رفتار امن برای CI و عادت روزمره؛ برای دیباگ تکراری میتوان استک را نگه داشت و بعد با--downبست. - ادامه بعد از شکست: میخواهیم ببینیم کدام سوئیتها شکستند، نه فقط اولینشان.
- تفکیک SKIPPED از FAIL: نبود اینترنت یا image سنگین sentiment سیگنال «کد خراب است» را آلوده نکند.
- پروفایل
test: سرویسهای تست باbring_up/ استک روزمره بالا نمیآیند. - جدا از Ansible deploy: playbook فقط bring_up + check_infra؛ این اسکریپت عمداً در deploy نیست.
۶. دستورات
# اجرای کامل (.env.test در صورت نبود از example ساخته میشود؛
# در پایان استک تست خودکار down میشود)
./scripts/run_tests_in_docker.sh
# بدون rebuild imageها
./scripts/run_tests_in_docker.sh --no-build
# نگه داشتن استک برای تکرار سریع، سپس teardown دستی
./scripts/run_tests_in_docker.sh --keep
./scripts/run_tests_in_docker.sh --no-build --keep
./scripts/run_tests_in_docker.sh --down
./scripts/run_tests_in_docker.sh --help
# اختیاری: اگر میخواهید سوئیت sentiment اجرا شود (نه SKIPPED)
docker compose --profile tools build sentiment
پیشنیاز: Docker Engine + پلاگین Compose؛ فایل .env.test؛ برای Play Store در live: اینترنت خروجی؛ برای oracle: image با tshark؛ برای sentiment: image از قبل ساختهشده.
تأیید ایزوله بودن (هنگام اجرا با --keep):
docker compose -p playpulse_test ps
docker volume ls | grep playpulse_test
# نباید project_postgres مربوط به استک live را برای این run ببینید