在接口测试过程中,由于有些接口类型并不是安全的,比如DELETE
类型,上一次请求之后下一次再请求结果就不一样了。甚至有时接口之间的数据还会相互干扰, 导致接口断言失败时不能断定到底是接口程序引起的错误,还是测试数据变化引起的错误,那么该如何有效解决这个问题呢?
通过测试数据库,每轮测试之前将数据初始化,这样避免数据干扰。
在之前我们的接口项目django_resutful
使用的数据库是Python自带的SQLite3
。
Django还支持以下几种数据库:
PostgreSQL
MySQL
Oracle
接下来我们将会以Mysql来进行演示。
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
下载地址:https://dev.mysql.com/downloads/installer/
安装教程:自学网-Mysql教程
Navicat是一套数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。
首先打开setting.py
将DATABASES
修改如下:
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE':'django.db.backends.mysql',
'HOST':'127.0.0.1',
'PORT':'3306',
'NAME':'django_restful',
'USER':'root',
'PASSWORD':'',
'OPTIONS':{
'isolation_level':None,
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", },
}
}
也就是将原来sqllite
换成Mysql
再打开django_restful
中的__init__.py
,添加如下代码:
import pymysql
pymysql.install_as_MySQLdb()
上面代码表示安装MySQLdb驱动。
使用Navicat连接数据库如下所示:
然后创建数据库django_restful
Django提供了完善的模型(model)层来创建和存取数据,它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表。
打开api
中的models.py
创建如下代码:
from django.db import models
# Create your models here.
class User(models.Model):
username=models.CharField(max_length=100)
email=models.CharField(max_length=100)
groups=models.CharField(max_length=100)
def __str__(self):
return self.username
class Group(models.Model):
name=models.CharField(max_length=100)
def __str__(self):
return self.name
上面代码表示创建数据库的表,一个是User
,另外一个是Group
其中def __str__()
的作用是美化字段的显示,方便查看。如果没有__st__
方法&#xff0c;显示的结果是类似<__main__.test object at>
Django模型字段常用类型
创建好Model后需要分别在serializers.py
和views.py
来导入&#xff0c;同时去掉danjo默认的数据库。
serializers.py
# from django.contrib.auth.models import User,Group
from rest_framework import serializers
from api.models import User,Group
views.py
# from django.contrib.auth.models import User,Group
from rest_framework import viewsets
from api.serializers import UserSerializer,GroupSerializer
from api.models import User,Group
python manage.py makemigrations api
python manage.py migrate
迁移完成之后需要重新设置一个超级管理员账户&#xff0c;然后登录。
python manage.py createsuperuser
数据初始化操作主要包括&#xff1a;数据库连接&#xff0c;数据清除、数据插入、关闭数据库。在api
项目下面新建一个目录test_project
然后创建文件&#xff1a;mysql_action.py
from pymysql import connect
import yaml
class DB():
def __init__(self):
&#39;&#39;&#39;连接数据库&#39;&#39;&#39;
print(&#39;connect db&#39;)
self.conn&#61;connect(host&#61;&#39;127.0.0.1&#39;,user&#61;&#39;root&#39;,
password&#61;&#39;&#39;,db&#61;&#39;django_restful&#39;)
def clear(self,table_name):
&#39;&#39;&#39;清除表中数据&#39;&#39;&#39;
print(&#39;clear db...&#39;)
clear_sql &#61; &#39;truncate &#39; &#43; table_name &#43; &#39;;&#39;
with self.conn.cursor() as cursor:
#清除外键约束
cursor.execute("set foreign_key_checks&#61;0;")
cursor.execute(clear_sql)
self.conn.commit()
def insert(self, table_name, table_data):
&#39;&#39;&#39;插入数据&#39;&#39;&#39;
print(&#39;insert db...&#39;)
#遍历数据
for key in table_data:
table_data[key] &#61; "&#39;" &#43; str(table_data[key]) &#43; "&#39;"
key &#61; &#39;,&#39;.join(table_data.keys())
value &#61; &#39;,&#39;.join(table_data.values())
print(key)
print(value)
insert_sql &#61; "insert into " &#43; table_name &#43; "(" &#43; key &#43; ")" &#43; "values" &#43; "(" &#43; value &#43; ")"
print(inser_sql)
with self.conn.cursor() as cursor:
cursor.execute(insert_sql)
self.conn.commit()
def close(self):
&#39;&#39;&#39;关闭数据库连接&#39;&#39;&#39;
print(&#39;close db&#39;)
self.conn.close()
def init_data(self, datas):
&#39;&#39;&#39;初始化数据&#39;&#39;&#39;
print(&#39;init db...&#39;)
for table, data in datas.items():
self.clear(table)
for d in data:
self.insert(table, d)
self.close()
if __name__ &#61;&#61; &#39;__main__&#39;:
db&#61;DB()
#调试各个方法
db.clear(&#39;api_user&#39;)
db.clear(&#39;api_group&#39;)
user_data&#61;{&#39;id&#39;:1,&#39;username&#39;:&#39;51zxw&#39;,&#39;email&#39;:&#39;51zxw&#64;163.com&#39;}
db.insert(&#39;api_user&#39;,user_data)
group_data&#61;{&#39;id&#39;:1,&#39;name&#39;:&#39;Developer&#39;}
db.insert(&#39;api_group&#39;,group_data)
db.close()
#初始化数据
f&#61;open(&#39;datas.yaml&#39;,&#39;r&#39;)
datas&#61;yaml.load(f)
db.init_data(datas)
我们将初始化数据使用Yaml来封装&#xff0c;可以将数据与代码分离&#xff0c;方便测试数据的维护。在test_project
目录中创建datas.yaml
数据内容如下&#xff1a;
api_user:
- id: 1
username: sutune
email: sutune&#64;163.com
groups: http://127.0.0.1:8000/groups/1/
- id: 2
username: 51zxw
email: 51zxw&#64;163.com
groups: http://127.0.0.1:8000/groups/2/
api_group:
- id: 1
name: Developer
- id: 2
name: Tester
执行初始化后数据如下&#xff1a;
在test_project
下面创建一个测试模块test_diango_restful.py
test_django_restful.py
import requests
import unittest
from mysql_action import DB
import yaml
class UserTest(unittest.TestCase):
def setUp(self):
self.base_url&#61;&#39;http://127.0.0.1:8000/users&#39;
self.auth&#61;(&#39;51zxw&#39;,&#39;zxw20182018&#39;)
def test_001_get_user(self):
r&#61;requests.get(self.base_url&#43;&#39;/1/&#39;,auth&#61;self.auth)
result&#61;r.json()
self.assertEqual(result[&#39;username&#39;],&#39;sutune&#39;)
self.assertEqual(result[&#39;email&#39;],&#39;sutune&#64;163.com&#39;)
# &#64;unittest.skip(&#39;skip add user&#39;)
def test_002_add_user(self):
form_data&#61;{&#39;id&#39;:3,&#39;username&#39;:&#39;zxw666&#39;,&#39;email&#39;:&#39;zxw666&#64;qq.com&#39;,&#39;groups&#39;:&#39;http://127.0.0.1:8000/groups/2/&#39;}
r&#61;requests.post(self.base_url&#43;&#39;/&#39;,data&#61;form_data,auth&#61;self.auth)
result&#61;r.json()
self.assertEqual(result[&#39;username&#39;],&#39;zxw666&#39;)
# &#64;unittest.skip(&#39;skip test_delete_user&#39;)
def test_003_delete_user(self):
r&#61;requests.delete(self.base_url&#43;&#39;/2/&#39;,auth&#61;self.auth)
self.assertEqual(r.status_code,204)
def test_004_update_user(self):
form_data&#61;{&#39;email&#39;:&#39;zxw2018&#64;163.com&#39;}
r&#61;requests.patch(self.base_url&#43;&#39;/1/&#39;,auth&#61;self.auth,data&#61;form_data)
result&#61;r.json()
self.assertEqual(result[&#39;email&#39;],&#39;zxw2018&#64;163.com&#39;)
def test_005_no_auth(self):
r&#61;requests.get(self.base_url)
result&#61;r.json()
self.assertEqual(result[&#39;detail&#39;],&#39;Authentication credentials were not provided.&#39;)
class GroupTest(unittest.TestCase):
def setUp(self):
self.base_url&#61;&#39;http://127.0.0.1:8000/groups&#39;
self.auth&#61;(&#39;51zxw&#39;,&#39;zxw20182018&#39;)
def test_001_group_developer(self):
r&#61;requests.get(self.base_url&#43;&#39;/1/&#39;,auth&#61;self.auth)
result&#61;r.json()
self.assertEqual(result[&#39;name&#39;],&#39;Developer&#39;)
def test_002_add_group(self):
form_data&#61;{&#39;name&#39;:&#39;Pm&#39;}
r&#61;requests.post(self.base_url&#43;&#39;/&#39;,auth&#61;self.auth,data&#61;form_data)
result&#61;r.json()
self.assertEqual(result[&#39;name&#39;],&#39;Pm&#39;)
def test_003_update_group(self):
form_data&#61;{&#39;name&#39;:&#39;Boss&#39;}
r&#61;requests.patch(self.base_url&#43;&#39;/2/&#39;,auth&#61;self.auth,data&#61;form_data)
result&#61;r.json()
self.assertEqual(result[&#39;name&#39;],&#39;Boss&#39;)
def test_004_detele_group(self):
r&#61;requests.delete(self.base_url&#43;&#39;/1/&#39;,auth&#61;self.auth)
self.assertEqual(r.status_code,204)
if __name__ &#61;&#61; &#39;__main__&#39;:
db&#61;DB()
f &#61; open(&#39;datas.yaml&#39;, &#39;r&#39;)
datas &#61; yaml.load(f)
db.init_data(datas)
unittest.main()
这样每次迭代回归测试就不用担心数据环境相互干扰的问题了。
在test_project
目录下面创建reports
目录&#xff0c;然后新建run.py
模块。
import unittest
from BSTestRunner import BSTestRunner
from mysql_action import DB
import time
import yaml
#数据初始化操作
db&#61;DB()
f &#61; open(&#39;datas.yaml&#39;, &#39;r&#39;)
datas &#61; yaml.load(f)
db.init_data(datas)
#指定测试用例和测试报告的路径
test_dir &#61; &#39;.&#39;
report_dir &#61; &#39;./reports&#39;
#加载测试用例
discover &#61; unittest.defaultTestLoader.discover(test_dir, pattern&#61;&#39;test_django_restful.py&#39;)
#定义报告的文件格式
now &#61; time.strftime("%Y-%m-%d %H_%M_%S")
report_name &#61; report_dir &#43; &#39;/&#39; &#43; now &#43; &#39; test_report.html&#39;
#运行用例并生成测试报告
with open(report_name, &#39;wb&#39;) as f:
runner &#61; BSTestRunner(stream&#61;f, title&#61;" API Test Report", description&#61;"Django Restful Api Test Report")
runner.run(discover)
最后生成的测试报告如下&#xff1a;
在自动化测试项目中&#xff0c;日志是非常重要的一个部分&#xff0c;特别是当运行出现错误时&#xff0c;需要查看日志来分析定位解决问题。在test_project
目录下面创建日志配置文件 log.conf
下面日志配置文件&#xff0c;定义的日志的输出格式&#xff0c;输出路径等信息。然后创建文件夹logs
存放日志信息。
[loggers]
keys&#61;root,infoLogger
[logger_root]
level&#61;DEBUG
handlers&#61;consoleHandler,fileHandler
[logger_infoLogger]
handlers&#61;consoleHandler,fileHandler
qualname&#61;infoLogger
propagate&#61;0
[handlers]
keys&#61;consoleHandler,fileHandler
[handler_consoleHandler]
class&#61;StreamHandler
level&#61;INFO
formatter&#61;form02
args&#61;(sys.stdout,)
[handler_fileHandler]
class&#61;FileHandler
level&#61;INFO
formatter&#61;form01
args&#61;(&#39;./logs/runlog.log&#39;, &#39;a&#39;)
[formatters]
keys&#61;form01,form02
[formatter_form01]
format&#61;%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
[formatter_form02]
format&#61;%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
在run.py
引入配置文件
import unittest
from BSTestRunner import BSTestRunner
import time,yaml
from mysql_action import DB
import logging.config
#引入日志配置文件
CON_LOG&#61;&#39;log.conf&#39;
logging.config.fileConfig(CON_LOG)
logging&#61;logging.getLogger()
#初始化数据
db&#61;DB()
f&#61;open(&#39;datas.yaml&#39;,&#39;r&#39;)
datas&#61;yaml.load(f)
db.init_data(datas)
test_dir&#61;&#39;.&#39;
report_dir&#61;&#39;./reports&#39;
discover&#61;unittest.defaultTestLoader.discover(test_dir,pattern&#61;&#39;test_django_restful.py&#39;)
now&#61;time.strftime(&#39;%Y-%m-%d %H_%M_%S&#39;)
report_name&#61;report_dir&#43;&#39;/&#39;&#43;now&#43;&#39; test_report.html&#39;
with open (report_name,&#39;wb&#39;) as f:
runner&#61;BSTestRunner(stream&#61;f,title&#61;&#39;API Test Report&#39;,description&#61;&#39;Django Restful API Test Report&#39;)
logging.info(&#39;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;API Test&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#39;)
runner.run(discover)
在mysql_action.py
添加日志
from pymysql import connect
import yaml
import logging
class DB():
def __init__(self):
logging.info(&#39;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;init data&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#39;)
logging.info(&#39;connect db...&#39;)
self.conn&#61;connect(host&#61;&#39;127.0.0.1&#39;,user&#61;&#39;root&#39;,password&#61;&#39;&#39;,db&#61;&#39;django_restful&#39;)
def clear(self,table_name):
logging.info(&#39;clear db...&#39;)
clear_sql&#61;&#39;truncate &#39;&#43;table_name&#43;&#39;;&#39;
with self.conn.cursor() as cursor:
cursor.execute(&#39;set foreign_key_checks&#61;0;&#39;)
cursor.execute(clear_sql)
self.conn.commit()
def insert(self,table_name,table_data):
for key in table_data:
table_data[key]&#61;"&#39;"&#43;str(table_data[key])&#43;"&#39;"
key&#61;&#39;,&#39;.join(table_data.keys())
value&#61;&#39;,&#39;.join(table_data.values())
logging.info(key)
logging.info(value)
insert_sql&#61;&#39;insert into &#39;&#43;table_name&#43;&#39;(&#39;&#43;key&#43;&#39;)&#39;&#43;&#39;values&#39;&#43;&#39;(&#39;&#43;value&#43;&#39;)&#39;
logging.info(insert_sql)
with self.conn.cursor() as cursor:
cursor.execute(insert_sql)
self.conn.commit()
def close(self):
logging.info(&#39;close db&#39;)
self.conn.close()
logging.info(&#39;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;init data finished!&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#39;)
def init_data(self,datas):
for table,data in datas.items():
self.clear(table)
for d in data:
self.insert(table,d)
self.close()
if __name__ &#61;&#61; &#39;__main__&#39;:
db&#61;DB()
# db.clear(&#39;api_user&#39;)
# db.clear(&#39;api_group&#39;)
# user_data&#61;{&#39;id&#39;:1,&#39;username&#39;:&#39;zxw2018&#39;,&#39;email&#39;:&#39;zxw2018&#64;163.com&#39;}
# db.insert(&#39;api_user&#39;,user_data)
# db.close()
f&#61;open(&#39;datas.yaml&#39;,&#39;r&#39;)
datas&#61;yaml.load(f)
db.init_data(datas)
最后在test_django_restful.py
添加日志。
import requests
import unittest
from mysql_action import DB
import yaml
import logging
class UserTest(unittest.TestCase):
def setUp(self):
self.base_url&#61;&#39;http://127.0.0.1:8000/users&#39;
self.auth&#61;(&#39;51zxw&#39;,&#39;zxw20182018&#39;)
def test_001_get_user(self):
logging.info(&#39;test_001_get_user&#39;)
r&#61;requests.get(self.base_url&#43;&#39;/1/&#39;,auth&#61;self.auth)
result&#61;r.json()
self.assertEqual(result[&#39;username&#39;],&#39;sutune&#39;)
self.assertEqual(result[&#39;email&#39;],&#39;sutune&#64;163.com&#39;)
def test_002_add_user(self):
logging.info(&#39;test_002_add_user&#39;)
form_data&#61;{&#39;username&#39;:&#39;zxw666&#39;,&#39;email&#39;:&#39;zxw666&#64;163.com&#39;,&#39;groups&#39;:&#39;http://127.0.0.1:8000/groups/2/&#39;}
r&#61;requests.post(self.base_url&#43;&#39;/&#39;,data&#61;form_data,auth&#61;self.auth)
result&#61;r.json()
self.assertEqual(result[&#39;username&#39;],&#39;zxw666&#39;)
self.assertEqual(result[&#39;email&#39;],&#39;zxw666&#64;163.com&#39;)
def test_003_update_user(self):
logging.info(&#39;test_003_update_user&#39;)
form_data&#61;{&#39;email&#39;:&#39;zxw2018&#64;163.com&#39;}
r&#61;requests.patch(self.base_url&#43;&#39;/1/&#39;,data&#61;form_data,auth&#61;self.auth)
result&#61;r.json()
self.assertEqual(result[&#39;email&#39;],&#39;zxw2018&#64;163.com&#39;)
def test_004_delete_user(self):
logging.info(&#39;test_004_delete_user&#39;)
r&#61;requests.delete(self.base_url&#43;&#39;/2/&#39;,auth&#61;self.auth)
self.assertEqual(r.status_code,204)
def test_005_no_auth(self):
logging.info(&#39;test_005_no_auth&#39;)
r&#61;requests.get(self.base_url)
result&#61;r.json()
self.assertEqual(result[&#39;detail&#39;],&#39;Authentication credentials were not provided.&#39;)
class GroupTest(unittest.TestCase):
def setUp(self):
self.base_url&#61;&#39;http://127.0.0.1:8000/groups&#39;
self.auth&#61;(&#39;51zxw&#39;,&#39;zxw20182018&#39;)
def test_001_group_developer(self):
logging.info(&#39;test_001_group_developer&#39;)
r&#61;requests.get(self.base_url&#43;&#39;/1/&#39;,auth&#61;self.auth)
result&#61;r.json()
self.assertEqual(result[&#39;name&#39;],&#39;Developer&#39;)
def test_002_add_group(self):
logging.info(&#39;test_002_add_group&#39;)
form_data&#61;{&#39;name&#39;:&#39;Pm&#39;}
r&#61;requests.post(self.base_url&#43;&#39;/&#39;,data&#61;form_data,auth&#61;self.auth)
result&#61;r.json()
self.assertEqual(result[&#39;name&#39;],&#39;Pm&#39;)
def test_003_update_group(self):
logging.info(&#39;test_003_update_group&#39;)
form_data&#61;{&#39;name&#39;:&#39;Boss&#39;}
r&#61;requests.patch(self.base_url&#43;&#39;/2/&#39;,data&#61;form_data,auth&#61;self.auth)
result&#61;r.json()
self.assertEqual(result[&#39;name&#39;],&#39;Boss&#39;)
def test_004_delete_group(self):
logging.info(&#39;test_004_delete_group&#39;)
r&#61;requests.delete(self.base_url&#43;&#39;/1/&#39;,auth&#61;self.auth)
self.assertEqual(r.status_code,204)
if __name__ &#61;&#61; &#39;__main__&#39;:
db&#61;DB()
f&#61;open(&#39;datas.yaml&#39;,&#39;r&#39;)
datas&#61;yaml.load(f)
db.init_data(datas)
unittest.main()
运行完成之后可以在logs
目录里面看到如下log&#xff1a;
2018-08-20 11:25:57,456 mysql_action.py[line:7] INFO &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;init data&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
2018-08-20 11:25:57,456 mysql_action.py[line:8] INFO connect db...
2018-08-20 11:25:57,465 mysql_action.py[line:12] INFO clear db...
2018-08-20 11:25:57,469 mysql_action.py[line:26] INFO email,username,id,groups
2018-08-20 11:25:57,469 mysql_action.py[line:27] INFO &#39;sutune&#64;163.com&#39;,&#39;sutune&#39;,&#39;1&#39;,&#39;http://127.0.0.1:8000/groups/1/&#39;
2018-08-20 11:25:57,470 mysql_action.py[line:30] INFO insert into api_user(email,username,id,groups)values(&#39;sutune&#64;163.com&#39;,&#39;sutune&#39;,&#39;1&#39;,&#39;http://127.0.0.1:8000/groups/1/&#39;)
2018-08-20 11:25:57,471 mysql_action.py[line:26] INFO email,username,id,groups
2018-08-20 11:25:57,471 mysql_action.py[line:27] INFO &#39;51zxw&#64;163.com&#39;,&#39;51zxw&#39;,&#39;2&#39;,&#39;http://127.0.0.1:8000/groups/2/&#39;
2018-08-20 11:25:57,473 mysql_action.py[line:30] INFO insert into api_user(email,username,id,groups)values(&#39;51zxw&#64;163.com&#39;,&#39;51zxw&#39;,&#39;2&#39;,&#39;http://127.0.0.1:8000/groups/2/&#39;)
2018-08-20 11:25:57,473 mysql_action.py[line:12] INFO clear db...
2018-08-20 11:25:57,477 mysql_action.py[line:26] INFO name,id
2018-08-20 11:25:57,477 mysql_action.py[line:27] INFO &#39;Developer&#39;,&#39;1&#39;
2018-08-20 11:25:57,477 mysql_action.py[line:30] INFO insert into api_group(name,id)values(&#39;Developer&#39;,&#39;1&#39;)
2018-08-20 11:25:57,478 mysql_action.py[line:26] INFO name,id
2018-08-20 11:25:57,478 mysql_action.py[line:27] INFO &#39;Tester&#39;,&#39;2&#39;
2018-08-20 11:25:57,479 mysql_action.py[line:30] INFO insert into api_group(name,id)values(&#39;Tester&#39;,&#39;2&#39;)
2018-08-20 11:25:57,479 mysql_action.py[line:37] INFO close db
2018-08-20 11:25:57,479 mysql_action.py[line:39] INFO &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;init data finished!&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
2018-08-20 11:25:57,658 run.py[line:28] INFO &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;API Test&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
2018-08-20 11:25:57,659 test_django_restful.py[line:60] INFO test_001_group_developer
2018-08-20 11:25:57,783 test_django_restful.py[line:67] INFO test_002_add_group
2018-08-20 11:25:57,903 test_django_restful.py[line:75] INFO test_003_update_group
2018-08-20 11:25:58,009 test_django_restful.py[line:83] INFO test_004_delete_group
2018-08-20 11:25:58,106 test_django_restful.py[line:14] INFO test_001_get_user
2018-08-20 11:25:58,211 test_django_restful.py[line:22] INFO test_002_add_user
2018-08-20 11:25:58,309 test_django_restful.py[line:32] INFO test_003_update_user
2018-08-20 11:25:58,405 test_django_restful.py[line:40] INFO test_004_delete_user
2018-08-20 11:25:58,496 test_django_restful.py[line:46] INFO test_005_no_auth
使用Jenkins持续集成平台我们可以自动定时执行自动化任务&#xff0c;自动发送邮件推送测试报告&#xff0c;这样会有效提高自动化测试执行效率。
打开Jenkins创建项目django_restful_api
然后在构建中选择 "执行Windows批处理" 填入如下内容&#xff1a;
d:
cd D:\django_restful\api\test_project
C:\Python35\python.exe run.py
执行完成后可以查看到控制台输出
最后在对应的报告文件夹可以看到生成对应的测试报告。
* * * * *
(五颗星&#xff0c;中间用空格隔开)
第一个*表示分钟&#xff0c;取值0~59
第二个*表示小时&#xff0c;取值0~23
第三个*表示一个月的第几天&#xff0c;取值1~31
第四个*表示第几月&#xff0c;取值1~12
第五个*表示一周中的第几天&#xff0c;取值0~7&#xff0c;其中0和7代表的都是周日
每天下午18点定时构建一次
0 18 * * 1-5
每天早上8点构建一次
0 8 * * *
每30分钟构建一次&#xff1a;
H/30 * * * *
Restful接口开发与测试—接口测试
Restful接口开发与测试—集成Swagger
Restful接口开发与测试—Django安装
Restful接口开发与测试—Rest简介
Python接口自动化——Requests基础功能
Python接口自动化——Requests
Jmeter&#43;Ant&#43;Jenkins接口自动化测试平台
Jmeter CSV文件管理与正则匹配
Jmeter变量设置
Jmeter简介与安装
Postman批量执行与集成Jenkins
Mac 环境Appium自动化测试环境搭建
众里寻他千百度—Appium Android 元素定位方式
Android自动化测试设备弹窗处理
Appium iOS 元素定位与操作
Ubuntu&#43;Docker&#43;STF环境搭建
Anyproxy抓包代理安装使用
Python自动化日志收集
关注公众号&#xff0c;更多干货秒得到