一、概述
不同的项目类型里面的单元测试基本不同
二、测试项目分析
1、models.py页面:模型页面
1.1、tests.py文件里面写入case
from django.test import TestCase from sign.models import Event,Guest #导入引用的模块 # Create your tests here. class ModelsTest(TestCase): #创建测试类,继承Django下面的TestCase方法 def test_event(self): #创建测试类 Event.objects.create(id=1, name="oneplus 3 event", status=True, limit=2000, address='shenzhen', start_time='2016-08-31 02:18:22') #数据初始化,创建一条发布会数据来提供后面进行查找 results = Event.objects.all() #调用,并不是真正的去查找相对应的数据,需要在前面先创建发布会的字段才可以查找到 print(results)
1.2、终端进入到相对应的目录,并且使用Test方法运行脚本
monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test Creating test database for alias 'default'... /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release. result = self._query(query) /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. result = self._query(query) System check identified no issues (0 silenced). <QuerySet [<Event: oneplus 3 event>]> . ---------------------------------------------------------------------- Ran 1 test in 0.005s OK Destroying test database for alias 'default'... /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release. result = self._query(query) /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. result = self._query(query)
1.3、运行原理
跟上面的unittest原理一样
先找代码中有没有继承Django中Test下面的TestCase类
再查找定义的方法中是否有test开头的方法,如果有的话就执行
case运行的先后顺序为:通过ASCII码的排序进行排序运行
初始化的数据并不会到数据库里面,只是提供测试操作
1.4、case的断言操作
tests.py文件
from django.test import TestCase from sign.models import Event,Guest #导入引用的模块 # Create your tests here. class ModelsTest(TestCase): #创建测试类,继承Django下面的TestCase方法 def test_event(self): #创建测试类 Event.objects.create(id=1, name="test1", status=True, limit=2000, address='shenzhen', start_time='2016-08-31 02:18:22') #初始化测试数据,供下面查询使用,这条数据并不会直接到数据库里面,只是提供测试查询需要 results = Event.objects.get(name = 'test1') #查询相对应的方式不会真正的去数据库查询数据,需要通过上面的方法创建数据 print(results.limit) print(results.address) self.assertEqual(results.limit,2000) #断言查询出来的数据是否limit = 2000 self.assertEqual(results.address,'shenzhen') #断言查询出来的数据 是否address = 'shenzhen'
终端运行结果
monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test Creating test database for alias 'default'... /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release. result = self._query(query) /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. result = self._query(query) System check identified no issues (0 silenced). 2000 shenzhen . ---------------------------------------------------------------------- Ran 1 test in 0.004s OK Destroying test database for alias 'default'... /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release. result = self._query(query) /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release. result = self._query(query)
1.5、使用setUp()、tearDown()
tests.py文件
from django.test import TestCase from sign.models import Event,Guest #导入引用的模块 # Create your tests here. class ModelsTest(TestCase): #创建测试类,继承Django下面的TestCase方法 def setUp(self): #初始化发布会数据 Event.objects.create(id=1, name="test1", status=True, limit=2000, address='shenzhen', start_time='2016-08-31 02:18:22') #初始化嘉宾表数据 Guest.objects.create(id=2, event_id=1, realname='alen', phone='13711001101', email='alen@mail.com', sign=False) #发布会的case def test_event(self): results =Event.objects.get(name = 'test1') print(results.limit) print(results.address) self.assertEqual(results.limit,2000) self.assertEqual(results.address,'shenzhen') #嘉宾表的case def test_guest(self): results =Guest.objects.get(realname= 'alen') self.assertEqual(results.phone,'13711001101') self.assertEqual(results.email,'alen@mail.com')
终端页面
monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test
Creating test database for alias 'default'...
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
result = self._query(query)
System check identified no issues (0 silenced).
2000
shenzhen
..
----------------------------------------------------------------------
Ran 2 tests in 0.010s
OK
Destroying test database for alias 'default'...
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
result = self._query(query)
2、views.py页面:视图页面
2.1、初始化测试环境
终端进入shell模式
导入Client类,模拟post、get请求,加入路径,如果返回码为200则表示成功,建立了测试环境
monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py shell Python 3.6.3 (default, Oct 17 2017, 00:27:06) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from django.test.utils import setup_test_environment >>> setup_test_environment() >>> >>> >>> >>> from django.test import Client #导入Client类 >>> c = Client() >>> response = c.get("/index/") #类似于模拟界面自动化测试的方法,加入相对应的跳转后缀,模拟index页面登录效果 >>> response.status_code #获取返回码
200
2.2、测试case编写
index页面登录case编写
class TestIndex(TestCase): def test_idex(self): respose = self.client.get('/index/') print(respose.status_code)
运行结果
monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test
Creating test database for alias 'default'...
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
result = self._query(query)
System check identified no issues (0 silenced).
200
.
----------------------------------------------------------------------
Ran 1 test in 0.017s
OK
Destroying test database for alias 'default'...
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
result = self._query(query)
2.3、断言判断
class TestIndex(TestCase): def test_idex(self): respose = self.client.get('/index/') self.assertEqual(respose.status_code,200) #断言状态码是否为200 self.assertTemplateUsed(respose,'new_index.html') #断言模板是否可用 # print(respose.status_code)
运行结果
monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test
Creating test database for alias 'default'...
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
result = self._query(query)
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.018s
OK
Destroying test database for alias 'default'...
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
result = self._query(query)
/usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
result = self._query(query)
2.4、登录case编写
from django.test import TestCase from sign.models import Event,Guest #导入引用的模块 from django.contrib.auth.models import User #导入用户表(在写登录单元测试case的时候需要创建一个用户来测试 class LoginActionTest(TestCase): def setUp(self): ''' 初始化测试数据:创建一个新的用户(与model层的初始化发布会、嘉宾表数据一样) :return: ''' User.objects.create_user('admin','admin@mail.com','admin123456') def test_add_author_email(self): ''' 添加测试用户 :return: ''' user = User.objects.get(username='admin') self.assertEqual(user.username,'admin') self.assertEqual(user.email,'admin@mail.com') def test_login_action_username_password_null(self): ''' 用户名、密码为空 :return: ''' response = self.client.post('/login_action/',{'input_username':'','input_password':''}) self.assertEqual(response.status_code,200) self.assertIn(b'username or password error!',response.content) #返回整个登录页面信息 def test_login_action_username_password_error(self): ''' 用户名、密码错误 :return: ''' test_data = {'username':'abc','password':'123'} response = self.c.post('/login_action/',data = test_data) self.assertEqual(response.status_code,200) self.assertIn(b'username or password error!',response.content) def test_login_action_success(self): ''' 登录成功 :return: ''' test_data = {'username':'admin','password':'admin123456'} response = self.c.post('/login_actiom/',data = test_data) self.assertEqual(response.status_code,302)
3、templates(模板)
只是一个HTML页面,不能进行测试,如果HTML页面有JS代码(script)可以进行测试
4、单独执行相对应的接口
python3 manage.py test sign
python3 manage.py test sign.tests.TestIndex