在Django中实现单元测试和集成测试

2023-04-11 00:00:00 测试 集成 单元测试

单元测试是针对程序中最小的可测试单元(如函数、方法)进行测试的过程。在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'...

表示测试成功通过。

相关文章