python2.7 unittest接口自动化

pyopenssl-master.zip

注册码:https://jetlicense.nss.im/

选择License server, 在License server address 中输入:https://jetlicense.nss.im/ 

如以上已过期,强烈推荐采用以下方法注册

http://idea.lanyus.com/

pycharm注册码

python2.7 unittest接口自动化_第1张图片

采坑系列

1.pip 9.0.3死活安不上,命令各种百度一下午,各种报错,or下载国内镜像都不行。。。

 Could not fetch URL https://pypi.python.org/simple/virtualenv/: There was a problem confirming the ssl certificate: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:590) - skipping

  Could not find a version that satisfies the requirement virtualenv (from versions: )

No matching distribution found for virtualenv

 

sudo -i 切换到root用户

whoami   --root

exit   --logout

whoami   --qa

sudo -i: 为了频繁的执行某些只有超级用户才能执行的权限,而不用每次输入密码,可以使用该命令。提示输入密码时该密码为当前账户的密码。没有时间限制。执行该命令后提示符变为“#”而不是“$”。想退回普通账户时可以执行“exit”或“logout” 

注:Python2.7需要手动安装pip 9.0.3,Python 3.x会提示安装,因为用的是Python2.7,如果安装pip-10.0.0.tar.gz ,会报错。高版本适用3系列

最后下载pip-9.0.3.tar.gz的包(下载地址https://pypi.python.org/simple/pip/ )安装pip 

cd /Users/qa/Desktop/QA/mac/python/pip-9.0.3

sudo python setup.py install

➜ ~ pip -V

pip 9.0.3 from /Library/Python/2.7/site-packages/pip-9.0.3-py2.7.egg (python 2.7)

参考博客 https://blog.csdn.net/lyj_viviani/article/details/70568434

升级Python

python -m pip install -U pip

或者sudo pip install --upgrade pip

2.安装完pip 9.0.3,再安装MySQL-python(MySQLdb,下载安装包地址为 https://sourceforge.net/projects/mysql-python/)

1>安装之前需要在本地安装mysql,发现本地mysql启动时报错Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql'。解决办法:sudo chown -R  _mysql:wheel  /usr/local/mysql/data  再启动mysql,查看是否起来ps -ef|grep mysql

2>修改MySQL-python的配置路径,sudo vim /Users/qa/Desktop/QA/mac/python/MySQL-python-1.2.5/setup_posix.py

mysql_config.path = "/usr/local/mysql/bin/mysql_config"

修改之后安装MySQLdb

cd /Users/qa/Desktop/QA/mac/python/MySQL-python-1.2.5

sudo python setup.py install

就好了

3.安装redis以及其他模块--这里很顺利,没有报错

4.mac下testStart.py需要加

#对caseToRun需要解析的域名换行

oneList = oneList.replace('\r', '')

否则在字典中无法查找到case对应的路径

python2.7 unittest接口自动化_第2张图片

不加\r 跑完的log如下

2018 Apr 15 Sun,15:18:56 [INFO] 开始执行测试用例...
shark项目访问域名:qa.XX.cn:8016
server_new项目访问域名:betassapinew.XX.cn:9016
测试报告路径:/Users/qa/Desktop/QA/report/testResultNone.html
2018 Apr 15 Sun,15:18:56 [INFO] 测试用例已执行完成,测试报告路径:/Users/qa/Desktop/QA/report/testResultNone.html

Windows下解析配置文件没有加\r,mac不加\r识别不了

python2.7 unittest接口自动化_第3张图片

python2.7 unittest接口自动化_第4张图片

 

5.mac下Handlers>dbHandler.py数据库查询出来的中文乱码,id后面多了个L,做了优化如下

1>导包

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
import json

2>class DBHandler()下

rself.conn = MySQLdb.connect(host='127.0.0.1', # 此处必须是是127.0.0.1
port=self.server.local_bind_port, user=user, passwd=pswd, db=db)  增加  charset=charset

self.conn = MySQLdb.connect(host='127.0.0.1', # 此处必须是是127.0.0.1
port=self.server.local_bind_port, user=user, passwd=pswd, db=db,charset=charset)

3>在findDB、insertDB、updateDB、delDB方法的findResult = self.cursor.fetchall()后面增加代码  findResult = str(json.dumps(findResult, ensure_ascii=False)) --

这是因为json.dumps 序列化时对中文默认使用的ascii编码,想输出真正的中文需要指定ensure_ascii=False

python2.7 unittest接口自动化_第5张图片

未优化之前的运行结果如下

python2.7 unittest接口自动化_第6张图片

 

Case编写规范总结,欢迎纠正~

SuiteAndCases--casePath.py--caseToRun–新目录同级导包(__init__.py)–ssRequests(域名 端口 接口名 参数拼接,发起Request请求)--SuiteAndCases(具体case的设计,每次调用ssRequests)

1>Python类名大写,与Java不同的是类名与文件名不必须一致

2>类名格式必须为unittest.TestCase,如class SendSmsCode(unittest.TestCase)

3>SuiteAndCases所有的方法名(一个方法就是一个case)都必须以test开头

 

4.数据库查询结果字段顺序与输入的字段顺序不一致

python2.7 unittest接口自动化_第7张图片

# findResult = str(json.dumps(findResult, ensure_ascii=False))注释掉了

数组变成了字符串,无法通过下标取值

python2.7 unittest接口自动化_第8张图片

case执行顺序test1,test2,test3...

python2.7 unittest接口自动化_第9张图片

解决本地不支持读取redis操作,在ssOperations.Parent.userOpers.py增加如下代码,连接跳板机,连接redis,根据key查找value

python2.7 unittest接口自动化_第10张图片

 

解决办法:更新pyOpenSSL 版本

https://github.com/pypa/virtualenv/issues/988

pip list

sudo -H pip install pyOpenSSL==0.15.1

python2.7 unittest接口自动化_第11张图片

有时候报错是因为Charles开着,关掉Charles就好了

但关闭Charles,接口请求打不开,需要在WiFi-锁-高级-代理,去掉网页代理HTTP和安全网页代理HTTPS-加锁

但mac每次重启后,此选项会再次自动勾选。因此 在src/Handlers/requestHandler.py  增加忽略SSL证书代码。这样Charles开着关着都可以了

终极解决办法:修改框架,忽略SSL证书

src/Handlers/requestHandler.py

 

import ssl

__getOne

# 忽略SSL证书,解决Charles开启状态代码运行报错

response = urllib2.urlopen(requestPath,timeout=self.HTTP_TIMEOUT, context=ssl._create_unverified_context())

python2.7 unittest接口自动化_第12张图片

__postOne
# 忽略SSL证书,解决Charles开启状态代码运行报错

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
openUrl = urllib2.build_opener(urllib2.HTTPCookieProcessor(), urllib2.HTTPSHandler(context=ctx))

python2.7 unittest接口自动化_第13张图片

https://stackoverflow.com/questions/19268548/python-ignore-certificate-validation-urllib2

对于周会上提出的问题,不是因为增加了这块代码导致个别同学运行代码报错,是因为Python版本为2.7.9(版本太低)导致,因为其他依赖也同样在此版本安装不上,升级下就OK了。而且增加此代码对框架完全无影响,Charles关闭打开均可

 

src/Handlers/dbHandler.py

python2.7 unittest接口自动化_第14张图片

PyCharm 快捷键

方法名重命名  fn+shitf+F6

整体向左   shift+tab

整体向右   tab

注释某行/多行代码   command+/

 

 

测试case构造

1>拼接同样的参数2次,value不一样,会取后者

https://betassapinew.XX.cn:9016/parent/user/check-mobile?source=iOSRCParent&version=192&mobile=XX&mobile=1111111

返回

{

"code": 10002,

"msg": "手机号不合法"

}

https://betassapinew.XX.cn:9016/parent/user/check-mobile?source=iOSRCParent&version=192&mobile=11111&mobile=XX

返回

{

"code": 20002,

"msg": "手机号已注册"

}

原因PHP里,拼接传参正常+不正常,会取第二个,因为,PHP会把请求参数转化为数组传值,数组会去重

python2.7 unittest接口自动化_第15张图片

2>拼接不存在的参数,接口不会报错,因为没有此参数,不会调用

 

Jenkins自动化代码服务器 10.10.xx.xx 路径 

提交完代码,需要登录FE服务器到以下路径 sudo git pull

/data/beta/ssApiAutoTest/ssApiAutoTest-pyunit   为student分支     注:ssApiAutoTest-pyunit-2为teacher分支

的testConfig.py 为提交的代码,但生效的在src/testConfig.py  

 

接口Response返回的格式 带“”为str格式,不带“”为int类型。一般接口自动化返回值为数据库DDL定义的类型,如果报错,需要修改类型

如果写成int(ret_Tea_getMyClass[2]['data']['list'][0]['classId'])。数据库ClassID定义为int,但接口定义的类型为string,需要强转str

"className": "一年级1班",
"status": 2,
"pubTime": 1528179940,

 

caseToRun.bak(在src下面,与casePath同级)文件内容如下

caseToRun='/parent/homework/homework-list'
HOST_SHARK=qa.XX.cn:8001
HOST_SERVERNEW=betassapinew.XX.cn:9004
HOST_PARENT=betassapinew.XX.cn:9016

 

因为 testStart.py文件增加HOST_PARENT

  if line.startswith('HOST_SHARK'):
        HOST_SHARK = line[line.index('=')+1:].replace('\r', '')
    if line.startswith('HOST_SERVERNEW'):
        HOST_SERVERNEW = line[line.index('=')+1:].replace('\r', '')
    if line.startswith('HOST_PARENT'):
        HOST_PARENT= line[line.index('=')+1:].replace('\r', '')
    if line.startswith('BUILD_NUMBER'):
        buildNumber = line[line.index('=')+1:].replace('\r', '')
    
    #如果勾选执行全部,则执行系统全部case
 if caseAllFlag==1:
        uriList = casePath.casePathDict.keys()
return HOST_SHARK,HOST_SERVERNEW,HOST_PARENT,uriList,buildNumber

 

作业库homework

SELECT max(TeacherID) FROM wx_edu_homework   比

susuan用户库ss

SELECT max(TeacherID) FROM wx_edu_teacher 大很多

SELECT max(TeacherID),max(UserID) FROM wx_edu_teacher 
SELECT 3900191-1849621+21356431 as maxTeaUserID


Homework作业库 SELECT max(StudentID) FROM wx_edu_homeworkanswer   比

susuan用户库 SELECT max(StudentID),max(UserID)  FROM wx_edu_student   大很多

 

# 为防止老师端布置完作业,家长端在短时间内或者并行请求作业列表,导致查询结果为空。因此推迟执行请求作业列表接口的时间
# Python time sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间
time.sleep(3)

 

# b = 100
# c = '%.2f' % b
# print str(c)
RightRate = str('%.2f' % f['RightRate'])
print '学生端答题正确率,浮点数RightRate为:' + RightRate

python2.7 unittest接口自动化_第16张图片

# 数据库wx_edu_homeworkanswer存的SpendTime为毫秒,整型。也可以float(12700)/1000,也可以12700*1.0/1000
"spendTime": int(round(float(f['SpendTime']) / 1000)),

 

浏览器:

ctrl+command+O  截图且识别图片中的文字

Navicat:

command+/  注释当前行

postman:

command+/  显示快捷键

 

框架整理

- python2.7环境
- mysqlDB依赖包:windows版本: 右键管理员权限运行安装 MySQL-python-1.2.3.win-amd64-py2.7.exe(在附件中)
- HTMLTestRunner.py 测试报告依赖包,把HTMLTestRunner.py放到自己的python安装Lib\site-packages目录下。例如D:\Python27\Lib\site-packages》》HTMLTestRunner.py(在附件中)
- redis模块安装:cmd控制台到本地的python安装目录\Scripts下执行命令 pip install redis等待安装完成(pip是python环境的内置工具通常用于下载安装服务模块,如果本地不支持pip命令,百度即可)
- sshtunnel模块安装:cmd控制台到本地的python安装目录\Scripts下执行命令 pip install sshtunnel等待安装完成(该模块用于本机连接内网数据库通过ssh方式使用,服务器上无需单独安装)
- parameterized模块安装:cmd控制台到本地的python安装目录\Scripts下执行命令 pip install parameterized等待安装完成(该模块用于unittest的参数化,参考文档:https://pypi.python.org/pypi/parameterized
依赖包版本请使用pip list命令检查本地依赖包的版本号,推荐sshtunnel(0.1.3)、pycrypto(2.6)、pyasn1(0.4.2)、MySQL-python(1.2.3)或以上
- flask 站点服务模块安装:cmd控制台到本地的python安装目录\Scripts下执行命令 pip install flask等待安装完成(该模块用于创建web服务,api接口)
- jsonschema jsonschema用于校验返回json的数据结构,每次出题后我们使用jsonschma来确保题目的基本格式没有问题
- SSL 导包 import ssl,忽略SSL证书,解决Charles开启状态代码运行报错,如果本地没有OpenSSL,使用命令sudo -H pip install pyOpenSSL==0.15.1安装
如果失败,pyopenssl-master.zip放到Lib\site-packages下,包下载地址为
http://la.XX.cn:8090/pages/viewpage.action?pageId=5867738

**《Handlers》该目录用于一些工具类定义,一般很少进行变更,或统一变更**

assertHandler.py 常用自定义断言方法(列表判断、字典json类型key判断、字典json类型keyAndValue判断...后续可添加)
dbHandler.py 常用数据库操作:增删改查(基本不需要变动,使用时调用封装好的方法)
logHandler.py 后台日志记录定义:不需要修改,一般也不需要调用。目前已在所有接口请求和数据库操作等底层进行了日志记录(测试用例不需要单独记录日志,有其他方式记录结果)
requestHandler.py 接口请求方法定义:post和get方式。不需要修改,请求接口时有封装方法调用。

**《SuiteAndCases》测试用例和测试集合**

init定义整体的测试集合unittest.TestSuite,执行时会加载指定的测试用例(通常一般很少进行变更,或统一变更)
第一层:分为Student、Teacher、Parent单独的package包
第二层:按具体业务模块测试用例集合,每次新增业务模块,需要单独添加,例如:
cases_suite_ability 能力模块测试用例集合
cases_suite_arena 竞技场模块测试用例集合
cases_suite_checkIn 签到模块测试用例集合
...
第三层:测试用例文件,每个文件为一个独立的接口的测试用例文件,其中包含多个test开头的方法为测试用例,例如
case_checkIn.py 为今日签到/user/checkin/checkin接口测试用例文件,其中包含测试用例:
def testCheckInDayForNormalUser (校验前6次每天正常签到,普通用户正常增加金币奖励)
def testCheckInDayForVipUser (校验前6次每天正常签到,会员用户正常增加金币奖励,其中1、3、5天奖励翻倍)
def testCheckInDayDupForNormalUser (校验普通用户当天不可重复签到,奖励不增加)

**《ssOperations》被测试用例调用的常用和通用行为和操作,比如共用的创建用户、登录用户、查询指定业务数据...**

第一层:分为Student、Teacher、Parent单独的package包
第二层:按具体业务模块定义各个业务模块的常用方法或查询逻辑
checkInOpers 为签到模块测试用例提供的该业务的常用方法
readingOpers 为绘本模块测试用例提供的该业务的常用方法

**《ssRequests》被测试用例和Operations调用的api接口定义**

第一层:分为Student、Teacher、Parent单独的package包
第二层:按具体业务模块定义各个api接口:包括请求方式,接口参数
checkInRequests 签到模块的api接口
readingRequest 绘本模块api接口

**casePath.py api接口和测试用例文件(相对根目录路径)映射关系 ,例如:**

'/user/checkin/checkin':'/SuiteAndCases/Student/cases_suite_checkIn/case_checkIn.py', 表示签到checkin这个接口的测试用例文件为后面这个case_checkIn.py文件

**testStart.py 自动化测试执行入口文件** 

**testConfig.py 数据库定义和执行日志、报告文件路径定义等** 【不同环境定义不同,因此不在git版本控制中】

**caseRegister.py 可被执行的api接口,用于给jenkins界面化选择参数使用** 【本地调试或单个用例执行时与此文件无关】

文件内容:
test_uri_student=/common/version/check-update,/user/auth/register-mobile-exists
test_uri_teacher=/teacher/class/create-class
test_uri_parent=aaa,bbb,ccc

**caseToRun || caseToRun.bak 入口执行时真正被执行的指定环境域名和被执行测试的api接口** 

jenkins集成执行时会从界面填写参数写入caseToRun文件
本地由testStart入口文件执行时,可手动写caseToRun.bak文件,执行caseToRun.bak文件内容
本地单独调试单个测试用例时,与该文件无关
文件内容格式:
caseToRun="/homework/once/question-list","aaa,bbb","aaa,bbb,ccc"
HOST_SHARK=qa.XX.cn:8001
HOST_SERVERNEW=beta.ssapinew.XX.cn:9001

### 项目结构介绍

**前提环境** :

- python2.7环境
- mysqlDB依赖包:windows版本: 右键管理员权限运行安装 MySQL-python-1.2.3.win-amd64-py2.7.exe(在附件中)
- HTMLTestRunner.py 测试报告依赖包,把HTMLTestRunner.py放到自己的python安装Lib\site-packages目录下。例如D:\Python27\Lib\site-packages》》HTMLTestRunner.py(在附件中)
- redis模块安装:cmd控制台到本地的python安装目录\Scripts下执行命令 pip install redis等待安装完成(pip是python环境的内置工具通常用于下载安装服务模块,如果本地不支持pip命令,百度即可)
- sshtunnel模块安装:cmd控制台到本地的python安装目录\Scripts下执行命令 pip install sshtunnel等待安装完成(该模块用于本机连接内网数据库通过ssh方式使用,服务器上无需单独安装)
- parameterized模块安装:cmd控制台到本地的python安装目录\Scripts下执行命令 pip install parameterized等待安装完成(该模块用于unittest的参数化,参考文档:https://pypi.python.org/pypi/parameterized
依赖包版本请使用pip list命令检查本地依赖包的版本号,推荐sshtunnel(0.1.3)、pycrypto(2.6)、pyasn1(0.4.2)、MySQL-python(1.2.3)或以上

**《Handlers》该目录用于一些工具类定义,一般很少进行变更,或统一变更**

assertHandler.py 常用自定义断言方法(列表判断、字典json类型key判断、字典json类型keyAndValue判断...后续可添加)
dbHandler.py 常用数据库操作:增删改查(基本不需要变动,使用时调用封装好的方法)
logHandler.py 后台日志记录定义:不需要修改,一般也不需要调用。目前已在所有接口请求和数据库操作等底层进行了日志记录(测试用例不需要单独记录日志,有其他方式记录结果)
requestHandler.py 接口请求方法定义:post和get方式。不需要修改,请求接口时有封装方法调用。

**《SuiteAndCases》测试用例和测试集合**

init定义整体的测试集合unittest.TestSuite,执行时会加载指定的测试用例(通常一般很少进行变更,或统一变更)
第一层:分为Student、Teacher、Parent单独的package包
第二层:按具体业务模块测试用例集合,每次新增业务模块,需要单独添加,例如:
cases_suite_ability 能力模块测试用例集合
cases_suite_arena 竞技场模块测试用例集合
cases_suite_checkIn 签到模块测试用例集合
...
第三层:测试用例文件,每个文件为一个独立的接口的测试用例文件,其中包含多个test开头的方法为测试用例,例如
case_checkIn.py 为今日签到/user/checkin/checkin接口测试用例文件,其中包含测试用例:
def testCheckInDayForNormalUser (校验前6次每天正常签到,普通用户正常增加金币奖励)
def testCheckInDayForVipUser (校验前6次每天正常签到,会员用户正常增加金币奖励,其中1、3、5天奖励翻倍)
def testCheckInDayDupForNormalUser (校验普通用户当天不可重复签到,奖励不增加)

**《ssOperations》被测试用例调用的常用和通用行为和操作,比如共用的创建用户、登录用户、查询指定业务数据...**

第一层:分为Student、Teacher、Parent单独的package包
第二层:按具体业务模块定义各个业务模块的常用方法或查询逻辑
checkInOpers 为签到模块测试用例提供的该业务的常用方法
readingOpers 为绘本模块测试用例提供的该业务的常用方法

**《ssRequests》被测试用例和Operations调用的api接口定义**

第一层:分为Student、Teacher、Parent单独的package包
第二层:按具体业务模块定义各个api接口:包括请求方式,接口参数
checkInRequests 签到模块的api接口
readingRequest 绘本模块api接口

**casePath.py api接口和测试用例文件(相对根目录路径)映射关系 ,例如:**

'/user/checkin/checkin':'/SuiteAndCases/Student/cases_suite_checkIn/case_checkIn.py', 表示签到checkin这个接口的测试用例文件为后面这个case_checkIn.py文件

**testStart.py 自动化测试执行入口文件** 

**testConfig.py 数据库定义和执行日志、报告文件路径定义等** 【不同环境定义不同,因此不在git版本控制中】

**caseRegister.py 可被执行的api接口,用于给jenkins界面化选择参数使用** 【本地调试或单个用例执行时与此文件无关】
ƒ
文件内容:
test_uri_student=/common/version/check-update,/user/auth/register-mobile-exists
test_uri_teacher=/teacher/class/create-class
test_uri_parent=aaa,bbb,ccc

**caseToRun || caseToRun.bak 入口执行时真正被执行的指定环境域名和被执行测试的api接口** 

jenkins集成执行时会从界面填写参数写入caseToRun文件
本地由testStart入口文件执行时,可手动写caseToRun.bak文件,执行caseToRun.bak文件内容
本地单独调试单个测试用例时,与该文件无关
文件内容格式:
caseToRun="/homework/once/question-list","aaa,bbb","aaa,bbb,ccc"
HOST_SHARK=qa.XX.cn:8001
HOST_SERVERNEW=beta.ssapinew.XX.cn:9001

 

目录结构

ssApiAutoTest

      src

            Handlers

                        _init_.py

                        assertHandler.py   常用自定义断言方法(列表判断、字典json类型key判断、字典json类型keyAndValue判断...

                        dbHandler.py   常用数据库操作:增删改查(基本不需要变动,使用时调用封装好的方法)

                        logHandler.py   后台日志记录定义:不需要修改,一般也不需要调用。目前已在所有接口请求和数据库操作等底层进行了日志记录

                      (测试用例不需要单独记录日志,有其他方式记录结果)

                        redisHandler.py   查询redis某个键值、删除redis中数据库1的某个键、删除redis中数据库某个键

                        requestHandler.py   接口请求方法定义:post和get方式。不需要修改,请求接口时有封装方法调用                                                

            html

                        HTMLTestRunner.py   生成HTML报告

            SuiteAndCases

                        init定义整体的测试集合unittest.TestSuite,执行时会加载指定的测试用例。测试用例和测试集合

            ssOperations

           被测试用例调用的常用和通用行为和操作,比如共用的创建用户、登录用户、查询指定业务数据...

            ssRequests

           被测试用例和Operations调用的api接口定义

            casePath.py

                        api接口和测试用例文件(相对根目录路径)映射关系

            caseRegister

                        可被执行的api接口,用于给jenkins界面化选择参数使用

            casetoRun.bak

                        入口执行时真正被执行的指定环境域名和被执行测试的api接口

            log.log

            logsoneLog.log

            test.py

            testConfig.py

                        数据库定义和执行日志、报告文件路径定义等

            testStart.py

                        自动化测试执行入口文件

个人配置

TEST_REPORT_DIR='/Users/qa/Desktop/QA/report/testResult'
TEST_LOG_PATH='/Users/qa/Desktop/QA/report/log.log'
#ssh配置连接远程跳板机设置,服务器不需配置,仅本地调试使用
SSHFLAG = True #开关控制是否启用ssh连接内网数据库
SSH_JUMP_HOST = 'xx.xx.xx.xx' #跳板机IP
SSH_JUMP_PORT = 22 #本地连接跳板机端口号,默认一般都是22
LOCAL_SSH_USERNAME='lishan' #连接跳板机用户
LOCAL_SSH_PASSWORD='xxxxxx' #私钥证书密码
LOCAL_SSH_PKEYPATH = "/Users/qa/Desktop/jump/id_rsa" #私钥文件,需要换成自己个人目录

 

goland注册码

http://47.104.167.217

 

你可能感兴趣的:(code)