pyopenssl-master.zip
注册码:https://jetlicense.nss.im/
选择License server, 在License server address 中输入:https://jetlicense.nss.im/
如以上已过期,强烈推荐采用以下方法注册
http://idea.lanyus.com/
pycharm注册码
采坑系列
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对应的路径
不加\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识别不了
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
未优化之前的运行结果如下
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.数据库查询结果字段顺序与输入的字段顺序不一致
# findResult = str(json.dumps(findResult, ensure_ascii=False))注释掉了
数组变成了字符串,无法通过下标取值
case执行顺序test1,test2,test3...
解决本地不支持读取redis操作,在ssOperations.Parent.userOpers.py增加如下代码,连接跳板机,连接redis,根据key查找value
解决办法:更新pyOpenSSL 版本
https://github.com/pypa/virtualenv/issues/988
pip list
sudo -H pip install pyOpenSSL==0.15.1
有时候报错是因为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())
__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))
https://stackoverflow.com/questions/19268548/python-ignore-certificate-validation-urllib2
对于周会上提出的问题,不是因为增加了这块代码导致个别同学运行代码报错,是因为Python版本为2.7.9(版本太低)导致,因为其他依赖也同样在此版本安装不上,升级下就OK了。而且增加此代码对框架完全无影响,Charles关闭打开均可
src/Handlers/dbHandler.py
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会把请求参数转化为数组传值,数组会去重
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
# 数据库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