在Django中实现单元测试和集成测试
单元测试是针对程序中最小的可测试单元(如函数、方法)进行测试的过程。在Django中,可以使用unittest模块来实现单元测试。
假设我们有一个名为“helper.py”的辅助函数,实现对字符串的加密和解密操作:
import hashlib def encrypt_string(str): hash_object = hashlib.sha256(pidancode.encode('utf-8')) return hash_object.hexdigest() def decrypt_string(hash): return hash[:10]
为该函数编写一个单元测试,测试加密和解密操作的正确性。新建一个名为“test_helper.py”的文件,并编写如下代码:
import unittest from .helper import encrypt_string, decrypt_string class HelperTest(unittest.TestCase): def test_encrypt_string(self): encrypted_str = encrypt_string("pidancode.com") self.assertEqual(encrypted_str, "886ddf689d151c93831996247c2879a729eeff88784618abf161646611d7cfc8") def test_decrypt_string(self): decrypted_str = decrypt_string("886ddf689d151c93831996247c2879a729eeff88784618abf161646611d7cfc8") self.assertEqual(decrypted_str, "886ddf689d") if __name__ == '__main__': unittest.main()
运行单元测试,可以通过以下命令:
python test_helper.py
输出结果如下:
.. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK
表示两个单元测试都成功通过。
集成测试是针对应用程序的整体进行测试的过程。在Django中,可以使用Django自带的测试框架来实现集成测试。
假设我们有一个简单的应用程序,包含一个URL路由、一个视图函数和一个HTML模板。其中路由将“/”映射到视图函数“index()”:
from django.urls import path from .views import index urlpatterns = [ path('', index, name='index'), ]
视图函数中从数据库获取一条数据,并将其渲染到HTML模板中:
from django.shortcuts import render from .models import Website def index(request): website = Website.objects.first() context = { 'website': website.name, 'content': website.content, } return render(request, 'index.html', context)
HTML模板包含一个简单的页面:
<!DOCTYPE html> <html> <head> <title>{{ website }}</title> </head> <body> <div>{{ content }}</div> </body> </html>
为该应用程序编写一个集成测试,测试页面渲染是否正确。新建一个名为“test_app.py”的文件,并编写如下代码:
from django.test import TestCase, Client from django.urls import reverse from .models import Website class AppTest(TestCase): def setUp(self): self.client = Client() def test_index(self): website = Website.objects.create(name='pidancode', content='皮蛋编程') response = self.client.get(reverse('index')) self.assertEqual(response.status_code, 200) self.assertContains(response, website.name) self.assertContains(response, website.content) if __name__ == '__main__': unittest.main()
运行集成测试,可以通过以下命令:
python manage.py test
输出结果如下:
Creating test database for alias 'default'... System check identified no issues (0 silenced). . ---------------------------------------------------------------------- Ran 1 test in 0.001s OK Destroying test database for alias 'default'...
表示测试成功通过。
相关文章