热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

restfulapi接口规范_Python接口测试数据管理

问题思考在接口测试过程中,由于有些接口类型并不是安全的,比如DELETE类型,上一次请求之后下一次再请求结果就不一样了。甚至有时接口之间的

问题思考

在接口测试过程中,由于有些接口类型并不是安全的,比如DELETE类型,上一次请求之后下一次再请求结果就不一样了。甚至有时接口之间的数据还会相互干扰, 导致接口断言失败时不能断定到底是接口程序引起的错误,还是测试数据变化引起的错误,那么该如何有效解决这个问题呢?

解决思路

通过测试数据库,每轮测试之前将数据初始化,这样避免数据干扰。

Django数据库管理

在之前我们的接口项目django_resutful使用的数据库是Python自带的SQLite3

Django还支持以下几种数据库:

  • PostgreSQL

  • MySQL

  • Oracle

接下来我们将会以Mysql来进行演示。

mysql简介

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

mysql下载安装

下载地址:https://dev.mysql.com/downloads/installer/

安装教程:自学网-Mysql教程

Navicat

Navicat是一套数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。

Django迁移MySql

修改Setting配置

首先打开setting.pyDATABASES 修改如下:

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

安装MySQLdb驱动

再打开django_restful中的__init__.py,添加如下代码:

import pymysql
pymysql.install_as_MySQLdb()

上面代码表示安装MySQLdb驱动。

连接数据库

使用Navicat连接数据库如下所示:

ab9b45a4fb2cd66699174a4badcc376c.png

然后创建数据库django_restful

创建Models

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__()的作用是美化字段的显示&#xff0c;方便查看。如果没有__st__方法&#xff0c;显示的结果是类似<__main__.test object at>

Django模型字段常用类型

d2f5a14a9b0fc3218cb4ad7f67462f91.png6c96c89c9fe43a229ae9251ec5ddf24c.png

导入Models

创建好Model后需要分别在serializers.pyviews.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;

142c9f5529c0f082b997c22c146e97a6.png

0b36342796e1c103402fb4e6fba6e499.png

测试用例封装

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;

8dea3a076acc5141824fad6922e8eabb.png

日志配置

在自动化测试项目中&#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

使用Jenkins持续集成平台我们可以自动定时执行自动化任务&#xff0c;自动发送邮件推送测试报告&#xff0c;这样会有效提高自动化测试执行效率。

打开Jenkins创建项目django_restful_api 然后在构建中选择 "执行Windows批处理" 填入如下内容&#xff1a;

d:
cd D:\django_restful\api\test_project
C:\Python35\python.exe run.py

c28c0ce5f9cab13c86444093b72c8c19.png

执行完成后可以查看到控制台输出

ef25619f5c91716a949fda6a98e03102.png

最后在对应的报告文件夹可以看到生成对应的测试报告。

Jenkins定时构建语法

* * * * *

(五颗星&#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自动化日志收集

e795aecf23b96db00d89428cb26e6f68.png

关注公众号&#xff0c;更多干货秒得到




推荐阅读
author-avatar
手机用户2502917001
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有