示例代码:
from rest_framework import status
from rest_framework.serializers import Serializer
from rest_framework.test import APITestCase
from apps.models import User
class UserAPITests(APITestCase):
# 此测试类运行结束后,会自动从数据库里销毁这份数据
def setUp(self):
# 在类里每个测试方法执行前会运行
# 在此方法执行前,django会运行以下操作
# 1. 重置数据库,数据库恢复到执行migrate后的状态
# 每个测试方法里对数据库的操作都是独立的,不会相互影响
#简单的数据在setUp里面创建
kwargs = dict(mobile_phone='15999999999', password='111111')
self.user = User.app_user_objects.create(**kwargs)
#def tearDown(self):
# 在类里每个方法结束执行后会运行,一般我们不用自己写,系统会自动调用父类的tearDown方法
#pass
def test_app_user_login_success(self):
#所有的测试方法都要以test_开头,系统会自动测试以test_开头的方法,test_后面跟的尽量写清楚自己要干什么,不求简洁,但求详细,要让别人一看就知道你在干什么
"""APP用户登录接口成功情况"""
# path使用硬编码,尽量不要使用reverse反解析url,以便在修改url之后能及时发现接口地址变化,并通知接口使用人员
path = '/api/api-token-auth/'
data = {'mobile_phone': '15999999999', 'password': '111111'}
response = self.client.post(path, data)
# response.data是字典对象
# response.content是json字符串对象
#判断接口返回的状态码是否与自己认为的一致
self.assertEquals(response.status_code,
status.HTTP_200_OK,
'登录接口返回状态码错误: 错误信息: {}'.format(response.content))
self.assertIn('token', response.data, '登录成功后无token返回')
常用断言
assertFalse(expr, msg=None)
判断返回的是否是False
assertTrue(expr, msg=None)
assertEqual(first, second, msg=None)
判断是否相等
assertNotEqual(first, second, msg=None)
assertAlmostEqual(first, second, places=None, msg=None, delta=None)
assertNotAlmostEqual(first, second, places=None, msg=None, delta=None)
assertSequenceEqual(seq1, seq2, msg=None, seq_type=None)
assertListEqual(list1, list2, msg=None)
assertTupleEqual(tuple1, tuple2, msg=None)
assertSetEqual(set1, set2, msg=None)
assertIn(member, container, msg=None)
判断member是否包含在container中
assertNotIn(member, container, msg=None)
assertIs(expr1, expr2, msg=None)
assertIsNot(expr1, expr2, msg=None)
assertDictEqual(d1, d2, msg=None)
assertDictContainsSubset(expected, actual, msg=None)
assertItemsEqual(expected_seq, actual_seq, msg=None)
assertMultiLineEqual(first, second, msg=None)
assertLess(a, b, msg=None)
assertLessEqual(a, b, msg=None)
assertGreater(a, b, msg=None)
assertGreaterEqual(a, b, msg=None)
assertIsNone(obj, msg=None)
assertIsInstance(obj, cls, msg=None)
assertNotIsInstance(obj, cls, msg=None)
assertRaisesRegexp(expected_exception, expected_regexp,
callable_obj=None, *args, **kwargs)
assertRegexpMatches(text, expected_regexp, msg=None)
assertNotRegexpMatches(text, unexpected_regexp, msg=None)
测试接口地址
测试接口地址建议使用硬编码,尽量不要使用reverse反解析url,原因是接口地址尽量避免改变,如果必须修改,需要以很明显的方式来提醒开发人员以便开发人员通知接口使用人员。
测试数据准备
有如下两种方法准备测试数据
1.简单的数据可以在setUp()里来创建;
2.复杂数据可以使用fixtures来写,并在赋值给测试类的fixtures属性;
fixtures数据示例
[{{
“model”: “myapp.person”,
“pk”: 1,
“fields”: {
“name”: “Xiaoming”,
“phone”: “123456”
}
},
{
“model”: “myapp.person”,
“pk”: 2,
“fields”: {
“name”: “xiangyu”,
“phone”: “963852741”
}
}
]
测试覆盖率(coverage)
在Pycharm里可以通用右键项目,选择Run ‘Test:’ with Coverage来查看测试的覆盖率。
使用Python 测试代码覆盖率统计工具 coverage.py
1:安装
pip install coverage
2:生成覆盖率统计文件
python -m coverage run --source='.' manage.py test --noinput
执行代码覆盖率统计,只需要通过coverage的run参数执行被统计代码即可。
跑完后,会自动生成一个覆盖率统计结果文件(data file):.coverage。如果要修改这个默认的文件名也可以,只要设置COVERAGE_FILE环境变量。
3:显示统计结果
python -m coverage report
有了覆盖率统计结果文件,只需要再运行report参数,就可以在命令里看到统计的结果。