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