Django 框架自帶了單元測試工具,利用該工具,我們可以方便地對單元進行錯誤檢查,以提高項目的質量。
在 Django 框架中,當新建一個應用時,會默認新建一個用於單元測試的 test.py 文件,我們的單元測試代碼就寫在 test.py 裡。
1、一個簡單的測試案例
在建立user應用,user應用中書寫一個測試案例:
from django.test import TestCase
def add(a,b): return a + b
if __name__ == '__main__': c = add(1,2) assert c == 3
c = add(1.0,2) assert c == 3.0
c = add(3,5) assert c == 9.0右鍵點擊運行該test.py文件,用例不通過則會報錯:
但是,自己寫的斷言不好確定錯誤的原因,如果測試用例增多,操作麻煩。因此可以考慮使用測試框架。
2、使用unittest測試框架模塊
Unittest模塊的測試用例,默認必須以test_開頭,否則找不到用例,該用例不執行。
from django.test import TestCaseimport unittestdef add(a,b): return a + b
class AddTest(unittest.TestCase): def test_init(self): self.assertEqual(add(1,2),3)
def test_float(self): self.assertEqual(add(1.0, 2), 3.0)
def test_err(self): self.assertEqual(add(3,5),9.0)
if __name__ == '__main__': unittest.main()運行:
結果要比自己寫assert要清晰
3、使用django內置的單元測試
Django.test中的TestCase其實是unittest的子類,因此在使用時,用例也必須以test_開頭,否則會出現找不到用例的情況。
from django.test import TestCasefrom .models import User
class simpleCase(TestCase): def setUp(self): User.objects.create(username='lili',password='123456',email='270108125@qq.com',is_active=False)
def test_model_add(self): user = User.objects.get(username='lili') self.assertIsNot(user,None)在項目目錄下,運行:python manage.py test
將查詢用戶名改為:lili1,即查詢不到。添加測試用例test_model_add1
def test_model_add1(self): user = User.objects.get(username='lili1') self.assertIsNot(user,None)
用代碼訪問網址的方法:
from django.test import Clientc = Client()response = c.post('/login/', {'username': 'john', 'password': 'smith'})response.status_code
response = c.get('/customer/details/')response.content測試登錄:
import hashlib
from django.test import TestCasefrom .models import Userfrom django.test import Client
class simpleCase(TestCase): def setUp(self): sha256 = hashlib.sha256() sha256.update('12345678'.encode('utf-8')) comparePwd = sha256.hexdigest() User.objects.create(username='lili',password=comparePwd,email='270108125@qq.com',is_active=False) self.client = Client()
def test_model_add(self): user = User.objects.get(username='lili') self.assertIsNot(user,None)
def test_get_login(self): response = self.client.get('/login/') self.assertEqual(response.status_code,200)
def test_post_login_1(self): self.client.post('/login/', {'user_name': 'lili', 'pwd': '12345678'}) sess = self.client.session.get('is_login', None) self.assertEqual(sess, 1)
def test_post_login_2(self): self.client.post('/login/', {'user_name': 'yuanyuan1', 'pwd': '12345678'}) sess = self.client.session.get('is_login', None) self.assertEqual(sess, None)登錄視圖代碼:
def login(request): if request.method == 'GET': return render(request,'login.html') else: username = request.POST.get('user_name') password = request.POST.get('pwd') sha256 = hashlib.sha256() sha256.update(password.encode('utf-8')) comparePwd = sha256.hexdigest()
user = User.objects.filter(username=username,password=comparePwd)
if not user: print("1") return render(request, 'login.html', { 'errMsg': '用戶名和密碼不正確' }) else: print("0") request.session['is_login'] = 1 request.session['user_name'] = username return HttpResponseRedirect('/index/')