restframework单元测试
示例代碼:
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):# 此測(cè)試類運(yùn)行結(jié)束后,會(huì)自動(dòng)從數(shù)據(jù)庫里銷毀這份數(shù)據(jù)def setUp(self):# 在類里每個(gè)測(cè)試方法執(zhí)行前會(huì)運(yùn)行# 在此方法執(zhí)行前,django會(huì)運(yùn)行以下操作# 1. 重置數(shù)據(jù)庫,數(shù)據(jù)庫恢復(fù)到執(zhí)行migrate后的狀態(tài)# 每個(gè)測(cè)試方法里對(duì)數(shù)據(jù)庫的操作都是獨(dú)立的,不會(huì)相互影響#簡(jiǎn)單的數(shù)據(jù)在setUp里面創(chuàng)建kwargs = dict(mobile_phone='15999999999', password='111111')self.user = User.app_user_objects.create(**kwargs)#def tearDown(self):# 在類里每個(gè)方法結(jié)束執(zhí)行后會(huì)運(yùn)行,一般我們不用自己寫,系統(tǒng)會(huì)自動(dòng)調(diào)用父類的tearDown方法#passdef test_app_user_login_success(self):#所有的測(cè)試方法都要以test_開頭,系統(tǒng)會(huì)自動(dòng)測(cè)試以test_開頭的方法,test_后面跟的盡量寫清楚自己要干什么,不求簡(jiǎn)潔,但求詳細(xì),要讓別人一看就知道你在干什么"""APP用戶登錄接口成功情況"""# path使用硬編碼,盡量不要使用reverse反解析url,以便在修改url之后能及時(shí)發(fā)現(xiàn)接口地址變化,并通知接口使用人員path = '/api/api-token-auth/'data = {'mobile_phone': '15999999999', 'password': '111111'}response = self.client.post(path, data)# response.data是字典對(duì)象# response.content是json字符串對(duì)象#判斷接口返回的狀態(tài)碼是否與自己認(rèn)為的一致self.assertEquals(response.status_code,status.HTTP_200_OK,'登錄接口返回狀態(tài)碼錯(cuò)誤: 錯(cuò)誤信息: {}'.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)
測(cè)試接口地址
測(cè)試接口地址建議使用硬編碼,盡量不要使用reverse反解析url,原因是接口地址盡量避免改變,如果必須修改,需要以很明顯的方式來提醒開發(fā)人員以便開發(fā)人員通知接口使用人員。
測(cè)試數(shù)據(jù)準(zhǔn)備
有如下兩種方法準(zhǔn)備測(cè)試數(shù)據(jù)
1.簡(jiǎn)單的數(shù)據(jù)可以在setUp()里來創(chuàng)建;
2.復(fù)雜數(shù)據(jù)可以使用fixtures來寫,并在賦值給測(cè)試類的fixtures屬性;
fixtures數(shù)據(jù)示例
[{{
“model”: “myapp.person”,
“pk”: 1,
“fields”: {
“name”: “Xiaoming”,
“phone”: “123456”
}
},
{
“model”: “myapp.person”,
“pk”: 2,
“fields”: {
“name”: “xiangyu”,
“phone”: “963852741”
}
}
]
測(cè)試覆蓋率(coverage)
在Pycharm里可以通用右鍵項(xiàng)目,選擇Run ‘Test:’ with Coverage來查看測(cè)試的覆蓋率。
使用Python 測(cè)試代碼覆蓋率統(tǒng)計(jì)工具 coverage.py
1:安裝
2:生成覆蓋率統(tǒng)計(jì)文件
python -m coverage run --source='.' manage.py test --noinput 執(zhí)行代碼覆蓋率統(tǒng)計(jì),只需要通過coverage的run參數(shù)執(zhí)行被統(tǒng)計(jì)代碼即可。 跑完后,會(huì)自動(dòng)生成一個(gè)覆蓋率統(tǒng)計(jì)結(jié)果文件(data file):.coverage。如果要修改這個(gè)默認(rèn)的文件名也可以,只要設(shè)置COVERAGE_FILE環(huán)境變量。3:顯示統(tǒng)計(jì)結(jié)果
python -m coverage report 有了覆蓋率統(tǒng)計(jì)結(jié)果文件,只需要再運(yùn)行report參數(shù),就可以在命令里看到統(tǒng)計(jì)的結(jié)果。總結(jié)
以上是生活随笔為你收集整理的restframework单元测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 错误代码:0x800F081F-0x20
- 下一篇: 计算机病毒免疫学,模块化免疫神经网络模型