下面是关于如何使用 Django 编写单元测试的攻略。
单元测试概述
单元测试是一种软件测试方法,它通过测试单个代码单元或组件的功能来验证该代码是否符合预期的行为。它对于保证代码质量,预防代码回归,减少 bug 数量非常重要。Django 也提供了内置的测试框架用于编写单元测试。
编写单元测试步骤
要编写单元测试,遵循以下步骤:
- 安装 Django 和其他测试相关的库:
pip install django
pip install coverage
- 创建测试应用:
python manage.py startapp myapp.tests
- 定义测试用例:
测试用例是一个包含一个或多个测试方法的类,每个测试方法都是一个可以被调用的方法,该方法测试一个代码单元或组件。
例如,假设我们有一个模型名为 Item
,该模型有一个 discount_price()
方法可以计算商品的折扣价。我们可以编写一个测试用例来确保该方法能够正确地计算折扣价:
from django.test import TestCase
from myapp.models import Item
class ItemTestCase(TestCase):
def test_discount_price(self):
item = Item(price=10, discount=0.1)
self.assertEqual(item.discount_price(), 9.0)
上述测试用例定义了一个 ItemTestCase
类,它包含一个 test_discount_price()
测试方法。该方法创建一个 Item
实例,并使用 assertEqual()
断言方法验证计算后的折扣价是否等于期望值。
- 运行测试:
对于测试应用或测试模块,我们可以运行以下命令来运行测试:
python manage.py test myapp.tests
Django 测试框架会搜索 tests.py
模块中定义的测试用例,并运行其中所有可以被调用的测试方法。
单元测试示例
下面给出两个单元测试的示例,一个是测试模型,一个是测试视图。
示例1:测试模型
假设我们有一个代码模型,用于在数据库中存储各个人员的职业。每个职业都有一个名称和一个对应的最低薪资。以下是该模型的定义:
from django.db import models
class Job(models.Model):
name = models.CharField(max_length=255)
min_salary = models.DecimalField(max_digits=8, decimal_places=2)
为了确保 Job
模型的功能正常,我们可以编写以下测试用例:
from django.test import TestCase
from myapp.models import Job
class JobTestCase(TestCase):
def test_create_job(self):
job = Job(name='Software Engineer', min_salary=60000)
self.assertEqual(job.name, 'Software Engineer')
self.assertEqual(job.min_salary, 60000)
上述测试用例通过创建一个新的 Job
实例,并使用 assertEqual()
断言方法验证模型的属性是否设置正确。
示例2:测试视图
假设我们有一个视图,用于处理用户的登录请求。以下是该视图的定义:
from django.contrib.auth import authenticate, login
from django.http import HttpResponse
def login_view(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return HttpResponse('Login success!')
else:
return HttpResponse('Invalid username or password!')
else:
return HttpResponse('Please use POST method to log in.')
为了确保该视图的功能正常,我们可以编写以下测试用例:
from django.test import TestCase
from django.urls import reverse
class LoginViewTestCase(TestCase):
def test_login(self):
url = reverse('login')
response = self.client.post(url, {'username': 'admin', 'password': '123456'})
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Login success!')
def test_invalid_login(self):
url = reverse('login')
response = self.client.post(url, {'username': 'admin', 'password': 'wrong_password'})
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Invalid username or password!')
上述测试用例使用 Django 测试工具的 Client
类进行 POST 请求,并使用 assertEqual()
和 assertContains()
断言方法验证登录请求的响应是否包含正确的消息。
以上就是 Django 的单元测试攻略和示例,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django写单元测试的方法 - Python技术站