Jeśli Twoja aplikacja wysyła wiadomości e-mail — potwierdzenia rejestracji, resety haseł, faktury, powiadomienia — potrzebujesz automatycznych testów weryfikujących, czy te wiadomości rzeczywiście docierają i zawierają prawidłową treść. Widzieliśmy zbyt wiele zespołów, które pomijają testowanie poczty, bo wydaje im się to skomplikowane. Nie jest, a ten przewodnik to udowodni.
Fundamentalny problem z testowaniem przepływów pocztowych polega na tym, że potrzebujesz prawdziwych, osiągalnych skrzynek, które możesz programowo odczytywać. Używanie prywatnych kont Gmail w pipeline'ach CI jest kruche, niebezpieczne i nie skaluje się. To właśnie tutaj jednorazowe API pocztowe znajdują swoje miejsce w dojrzałym stosie testowym.
Przygotowanie środowiska testowego Na początek pobierz klucz API z panelu EvilMail. Przechowuj go jako zmienną środowiskową w systemie CI — nigdy nie commituj kluczy API do repozytorium kodu. ``` export EVILMAIL_API_KEY="your_api_key_here" ```
Tworzenie testowego adresu e-mail Przed każdym przebiegiem testów wygeneruj nowy jednorazowy adres: ``` curl -X POST https://evilmail.pro/api/temp-email \ -H 'Content-Type: application/json' \ -H 'X-API-Key: '"$EVILMAIL_API_KEY" \ -d '{"domain": "evilmail.pro", "ttlMinutes": 30}' ```
Odpowiedź zawiera adres e-mail i token sesji. Użyj adresu do rejestracji konta testowego w swojej aplikacji.
Odpytywanie skrzynki odbiorczej Po wywołaniu akcji wysyłającej e-mail w Twojej aplikacji (rejestracja, reset hasła itp.) odpytuj endpoint skrzynki, aż wiadomość dotrze: ``` curl https://evilmail.pro/api/inbox \ -H 'X-API-Key: '"$EVILMAIL_API_KEY" ```
W rzeczywistym teście opakujesz to w pętlę z ponowieniami i timeoutem. Oto praktyczny przykład w Pythonie: ``` import requests import time
API_KEY = os.environ['EVILMAIL_API_KEY'] BASE = 'https://evilmail.pro'
def wait_for_email(subject_contains, timeout=60): deadline = time.time() + timeout while time.time() < deadline: r = requests.get(f'{BASE}/api/inbox', headers={'X-API-Key': API_KEY}) messages = r.json().get('data', []) for msg in messages: if subject_contains in msg['subject']: return msg time.sleep(3) raise TimeoutError('Email not received') ```
Integracja z pipeline'ami CI/CD Ten wzorzec działa bez zarzutu z dowolnym systemem CI — GitHub Actions, GitLab CI, Jenkins, CircleCI. Kluczowa zasada: każdy przebieg testów otrzymuje unikalny jednorazowy adres, wykonuje swoje asercje, a adres automatycznie wygasa. Bez skryptów czyszczących, bez współdzielonych skrzynek zaśmieconych starymi wiadomościami, bez niestabilnych testów powodowanych przez pozostałości z poprzednich uruchomień.
Krok w workflow GitHub Actions może wyglądać następująco: ``` - name: Run email integration tests env: EVILMAIL_API_KEY: ${'{ secrets.EVILMAIL_API_KEY }'} run: pytest tests/email/ -v --timeout=120 ```
Co weryfikować w asercjach Nie sprawdzaj wyłącznie, czy e-mail dotarł. Weryfikuj temat wiadomości, adres nadawcy, obecność kluczowych linków (URL-e weryfikacyjne, tokeny resetu) oraz to, czy te linki prowadzą do prawidłowych stron. Kompletny test e-maila waliduje cały łańcuch od wyzwolenia, przez dostarczenie, po poprawność treści.
Skalowanie do setek testów Dla dużych zestawów testów wymagających wielu jednoczesnych adresów e-mail użyj endpointu tworzenia kont, aby uruchomić adresy pod własną domeną. Daje to pełną kontrolę nad przestrzenią nazw i pozwala uniknąć limitów na endpoincie temp-email: ``` curl -X POST https://evilmail.pro/api/accounts \ -H 'X-API-Key: '"$EVILMAIL_API_KEY" \ -H 'Content-Type: application/json' \ -d '{"email": "[email protected]", "password": "testpass"}' ```
Po zakończeniu zestawu testów usuń konta testowe hurtowo: ``` curl -X DELETE https://evilmail.pro/api/accounts \ -H 'X-API-Key: '"$EVILMAIL_API_KEY" \ -H 'Content-Type: application/json' \ -d '{"emails": ["[email protected]"]}' ```
Podsumowanie Testowanie poczty nie powinno być kruchym dodatkiem w Twoim zestawie testów. Z odpowiednim API jednorazowej poczty staje się tak deterministyczne i niezawodne jak każdy inny test integracyjny. Wdrażaj z pewnością, że Twoje e-maile faktycznie działają.
