1. unittest
unittest是python自带的单元测试框架,unittest框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。 unittest 通过面向对象的方式支持的重要概念,包括TestFixture、TestCase、TestSuite、TestRunner
- 测试脚手架(test fixture)
为了开展测试所需要进行的准备工作,以及所有相关的清理操作。举个例子,包括创建临时或代理的数据库、目录,或者启动一个服务器进程。 - 测试用例(TestCase)
一个测试用例是一个独立的测试单元。它检查输入特定的数据时的响应。 - 测试套件(test suite)
测试套件是一系列的测试用例。它用于归档需要一起执行的测试。 - 测试运行器(test runner)
test runner 是一个用于执行和输出测试结果的组件。这个运行器可能使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。
更多:unittest — 单元测试框架 — Python 3.10.2 文档 (yali.edu.cn)
2. django.test.TestCase
django.test.TestCase是在unittest.TestCase基础上的二次封装,并且提供Client类用于模拟多种请求的发送测试。
3. Django测试示例
本测试只关心后台接口,不结合Selenium测试前台代码逻辑。 数据库层涉及到mysql和redis,http方法涉及到post、get和header头信息。 django框架的tests.py代码,示例中测试了model和views的list方法,代码如下:
tests.py
import json
from django.test import TestCase
from django.test import Client
from django.urls import reverse
from redis_util import redis_conn
from .models import WebSiteModel
from user.models import SysUser
class MyWebsiteTests(TestCase):
my_ip = '192.168.1.79'
client = None
login_token = '1234567890abcdef'
def setUp(self):
SysUser.objects.create(id=1, username='admin', password='123123123123abcabcabcabc'
email='test@baidu.com')
self.client = Client(HTTP_Authorization=self.login_token)
val = '{{"id":{}, "username": "{}"}}'.format(1, 'admin')
redis_conn.set('{}'.format(self.login_token), val, 60)
WebSiteModel.objects.create(id=1, ip=self.my_ip)
def test_models(self):
qs = WebSiteModel.objects.filter(ip__contains=self.my_ip)
self.assertEqual(qs.count(), 1, 'model is ok')
def test_login(self):
img_key = 'img_code_123123'
img_code = 'abc123'
redis_conn.set(img_key, img_code, 60)
res = self.client.post('/api/login/', data={'username': "admin", 'password': "123qwe",
'image_code': img_code, 'image_key': img_key})
self.assertEqual(res.status_code, 200)
json_dict = json.loads(res.content.decode('utf-8'))
self.login_token = json_dict.get('token', '')
print(self.login_token)
self.assertNotEqual(self.login_token, None)
def test_views_list(self):
res = self.client.get(reverse('website-list'))
self.assertEqual(res.status_code, 200)
json_dict = json.loads(res.content.decode('utf-8'))
self.assertEqual(json_dict.get('count'), 1)
views.py(部分代码)
from rest_framework.viewsets import ModelViewSet
class WebSiteViewSet(ModelViewSet):
queryset = WebSiteModel.objects.all()
def filter_queryset(self, queryset):
return queryset
def list(self, request, *args, **kwargs):
return super().list(request, *args, **kwargs)
urls.py
from rest_framework.routers import DefaultRouter
from .views import WebSiteViewSet
router = DefaultRouter()
router.register(r'website', WebSiteViewSet, basename='website')
urlpatterns = [
url(r'', include(router.urls)),
]
4. 执行测试
python manage.py test --keepdb
5. 附录reverse用法
django url的name属性,对该url进行别名,通过别名可以获取到该别名的url。 使用reverse(“app_create”)即可获取uri: http://localhost:8000/app/create
django rest-framework 与django类似,通过basename属性进行别名. 使用reverse(“App-list”)可以动态获取uri: http://localhost:8000/app/,可以获取所有app的list数据。
如果想要获取单个数据,需要在uri后面添加id。 reverse(“App-detail”, [1]),获取uri:http://localhost:8000/app/1/。
reverse用法原文链接:https://blog.csdn.net/qq_22918243/article/details/90200863
|