让我们使用Pytest进行电子邮件发送测试吧!
概述
让我们使用Django Rest Framework、Docker和MailCatcher来发送电子邮件吧!
让我们用Pytest编写一个测试代码来测试我们创建的邮件发送功能。
本次测试中,
-
- 件名
-
- 宛先
- 送信元
我希望确认这是否正确。
前提
-
- フレームワークはDjango Rest Framework
- pytest-djangoをインストール済み
编写代码
这次
-
- pytest.ini
-
- conftest.py
- test_email.py
进行所需的设置
pytest.ini 的中文释义是 pytest 配置文件。
要在Django中使用Pytest,必须将环境变量DJANGO_SETTINGS_MODULE的值设置为<项目名称>.settings。
raise ImproperlyConfigured(
E django.core.exceptions.ImproperlyConfigured:
Requested setting INSTALLED_APPS, but settings are not configured.
You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
由于项目名称为project,所以在此次中,pytest.ini文件将被放置在项目的根目录下,并按照以下方式进行记录。
[pytest]
DJANGO_SETTINGS_MODULE=project.settings
conftest.py请进行改写。
在使用Django进行Pytest执行时,需要使用测试数据库。
-
- テストDBのセットアップ
-
- fixtureファイルでDBにデータを入れる設定
-
- ログイン用テスト用ユーザとパスワード
- 送信元として使うテスト用メールアドレス
将fixture的内容写入conftest.py。
通常情况下,conftest.py应该在应用程序中创建一个tests文件夹,并将其放置在该文件夹下。
import pytest
from django.core.management import call_command
@pytest.fixture(scope='session')
def django_db_setup(django_db_setup, django_db_blocker):
with django_db_blocker.unblock():
call_command('loaddata', 'fixture.json')
@pytest.fixture
def management_user(db):
return ("00000001","test")
@pytest.fixture
def email_data():
return {
"email":"test_user_01@test.com",
}
测试邮件.py
使用django.core.mail.outbox可以查看收到的邮件。
-
- 件名
-
- 宛先
- 送信元
您可以调查等等事项。
import pytest
from django.core import mail
from rest_framework.test import APIClient
@pytest.mark.django_db()
class TestInviteUser:
# 今回は該当するエンドポイントへテストを行いたいのでAPIClientを使用します
client = APIClient()
url = "/api/users/send_invite_user_mail/"
def test_management_user_can_send_invite_user_email(self, management_user, email_data):
self.client.login(username=management_user[0], password=management_user[1])
response = self.client.post(self.url, email_data, format='json')
assert response.status_code == 200
# メールを一通受信したことを確認
assert len(mail.outbox) == 1
# メールの件名が正しいことを確認
assert mail.outbox[0].subject == "ようこそ"
# メールの送信元が正しいことを確認
assert mail.outbox[0].from_email == "example@mail.com"
# 宛先は複数存在するため、toは配列になります
# 今回はtest_user_01@test.comのみのため、to[0]と指定します
# メールの送信先が正しいことを確認
assert mail.outbox[0].to[0] == email_data["email"]
让我们进行测试吧!
执行命令,确认测试已成功通过。
docker-compose exec app poetry run pytest
Test session starts (platform: linux, Python 3.10.9, pytest 7.2.0, pytest-sugar 0.9.6)
django: settings: study.settings (from ini)
rootdir: /code, configfile: pytest.ini
plugins: django-4.5.2, custom-exit-code-0.3.0, sugar-0.9.6, cov-4.0.0
collecting ...
application/tests/test_email.py ✓ 100% ██████████
Results (2.81s):
1 passed
介绍这篇文章
我写了下面的文章,如果你愿意的话,请阅读一下。
请引用