一.前言/准备
测Django的东西仅限于在MTV模型。哪些可以测?哪些不可以。
1、html里的东西不能测。
- Html里的HTML代码大部分都是写死的,嵌套在html中的Django模板语言也不能测,即使有部分逻辑。但写测试用例时至少要调用一个类或者方法。模板语言没有出参也没有入参,不能测
2、models模型可测。属于数据库层
3、views视图层可以测。有入参、有方法。
综上:根据Django语言特点,可测models和views
二.Django单元测试具体步骤
1、在创建Django app时,已经自动生成了tests.py文件,我们直接在tests.py中编写我们的测试用例
# coding=utf-8
from django.test import TestCase # 导入Django测试包
from sign.models import Guest, Event # 导入models中的发布会、嘉宾类
#首先创建测试类
class ModelTest(TestCase):
# 初始化:分别创建一条发布会(Event)和一条嘉宾(Guest)的数据。
def setUp(self):
Event.objects.create(id=1, name="oneplus 3 event", status=True, limit=2000,address='shenzhen', start_time='2016-08-31 02:18:22')
Guest.objects.create(id=1, event_id=1, realname='alen',phone='13711001101', email='alen@mail.com', sign=False)
# 下面开始写测试用例了
# 1.通过get的方法,查询插入的发布会数据,并根据地址判断
def test_event_models(self):
result = Event.objects.get(name="oneplus 3 event")
self.assertEqual(result.address, "shenzhen")
self.assertTrue(result.status)
# 2.通过get的方法,查询插入的嘉宾数据,并根据名字判断
def test_guest_models(self):
result = Guest.objects.get(phone='13711001101')
self.assertEqual(result.realname, "alen")
self.assertFalse(result.sign)
2、执行tests.py文件
Django中,通过test命令可以查找并运行所有TestCase的子类
1)运行所有的测试用例
python manage.py test
2)运行某个app下面的所有的测试用例
python manage.py test someapp
3)运行某个app下面的tests.py文件
python manage.py test someapp.tests
4)运行某个app下面的tests.py文件中指定的class类ModeTest
python manage.py test someapp.tests.ModeTest
5)执行ModeTest类下的某个测试方法
python manage.py test someapp.tests.ModeTest.methodname
三.TestCase类得方法
-
assertTrue(boolean condition)
如果 condition 为 false 则失败;否则通过测试;
-
assertEquals(Object expected, Object actual)
根据 equals() 方法,如果 expected 和 actual 不相等则失败;否则通过测试;
-
assertEquals(int expected, int actual)
根据==操作符,如果 expected 和 actual 不相等则失败;否则通过测试。对每一个原始类型:int、float、double、char、byte、long、short和boolean,这个方法都会都一个函数的重载。(参见assertEquals() 的注释)
-
assertSame(Object expected, Object actual)
如果 expected 和 actual 引用不同的内存对象则失败;如果它们引用相同的内存对象则通过测试。两个对象可能并不是相同的,但是它们可能通过 equals() 方法仍然可以是相等的
-
assertNull(Object object)
如果对象为null则通过测试,反之看作失败
…等等
注意:
- 有两个assertEquals()的重载函数稍有不同。用来比较double和float的版本需要第三个参数:“精确程度”。这个精确程度确定了两个浮点值需要有多接近才能被认为它们是相等的。因为浮点运算并不是完全精确的,你可能会决定“这两个值如果相差不超过0.0001,那么它们就足够相近了”,用函数的方式来表达就是assertEquals(expectedDouble, actualDouble, 0.0001d)。
四.单元测试案例
函数测试
from django.test import TestCase # 导入Django测试包
def add(x, y):
return x + y
class FuncTest(TestCase):
# 初始化
def setUp(self):
self.x = 1
self.y = 2
# 下面开始写测试用例了
def add_test(self):
self.assertEquals(add(self.x, self.y), int(4))
模型测试
from django.test import TestCase # 导入Django测试包
from lianxi.models import User
# 对用户模型进行测试
class TestUserModel(TestCase):
# 初始化
def setUp(self):
self.user = User.objects.update_or_create(username='testuser', password='password')
# 下面开始写测试用例了
# 注意:一般测试模型就测试模型类得几个方法,测试类方法一般以 test_ 开头
def test_str(self):
self.assertEquals(self.user.__str__(), 'testuser')
# python3自带一个断言函数 assert 表达式 如果是True没操作如果是False就报错
视图/接口测试
from django.test import TestCase
from django.test import Client
# Create your tests here.
class APITest(TestCase):
def test_index_get(self):
"""
未传参数
:return:
"""
# self.client 是 django TestCase提供的一个可以在django运行时使用http客户端,用于发送请求得到响应
res = self.client.get('/index/') # 这传入的参数是path,该path是你项目中存在的路径
status_code = res.status_code
res_data = res.json() # 获取返回值
self.assertEqual(status_code, 200)
self.assertEqual(res_data.get('errorCode'), 0)
def test_index_get_params(self):
"""
传入相关参数
:return:
"""
res = self.client.get('/index/', {'page': 1, 'page_size': 10}) # 这传入的参数是path和params
status_code = res.status_code
res_data = res.json()
self.assertEqual(status_code, 200)
self.assertEqual(res_data.get('errorCode'), 0)
转载:看的太多前辈的资料整理出来的也找不到网址了抱歉!!!