Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

runnerhuang/autoapi

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

配置环境:

python 3.6以上即可
如需自动打开测试报告,还需要在网上下载对应版本的Firefox浏览器驱动文件,将浏览器驱动文件放入python3目录下即可(当然你也得装火狐浏览器) 1.https://github.com/mozilla/geckodriver/releases

使用方法:

一. 自动化工程python所需依赖库

执行命令:
pip install -r requirements.txt

二.工程项目运行方法:

工程项目运行方法:

1.只运行某一个测试用例执行

python main.py -F '测试路径的文件路径' -N 001

例子:
python main.py -F 'TestCase//EATOJOY//BACKEND//PUSH' -N 001 意思是执行TestCase//EATOJOY//BACKEND//PUSH目录下001序号文件夹里的所有test cases,若不设置-N则运行该目录下所有用例

2.运行同一目录下的某些测试用例执行(运行多个的时候,必须将-N的值设置成0)

python main.py -F '测试路径的文件路径' -CL '1,2'

例子: python main.py -F 'TestCase//EATOJOY//BACKEND//PUSH' -CL '1,2' 意思是依次执行TestCase//EATOJOY//BACKEND//PUSH目录下001和002序号文件夹里的所有test cases ps:若要运行多个路径下的用例则用;隔开,如-F 'TestCase//xxx//xx1;TestCase//xxx//xx2'

运行参数介绍:

-F 必选
-N 可选,默认0(全部用例)
-CL 可选 默认''' 【此参数与-N互斥,优先-N】
-TD 可选 默认1 (默认不执行teardown,0表示执行) -ENV 可选 默认'test' 切换环境参数,默认为测试环境(项目配置中"项目名称_test.ini"代表项目测试环境的配置,"项目名称_dev"代表项目dev环境的配置), 所以-ENV dev表示当前用例在dev环境中执行 -E 可选 默认0表示不发邮件,-E 1表示为发邮件(邮件接受人配置为项目ini文件中) -RR 可选 默认为0表示为失败不重跑,-RR 1表示为用例失败后重跑一次,-RR 2表示为用例失败后重跑两次 -DR 可选 默认0表示不执行项目数据准备文件,-DR 1表示执行项目数据准备文件(项目准备的意思是执行用例前准备一些共用的数据, 函数放在TestData文件夹下的"项目名称_dataReady"文件中) -RN 可选 默认0,失败重跑,例如:-RN 2 用例失败了再重跑两次 -LP 可选 默认0,循环执行,例如:-LP 1000 该用例执行1000次

三.编写测试用例:

1.做API接口测试的相关人员对于写json的用例熟悉。

范例:

{
	"input":{
			"method": "POST",
			"url":"http://XXXXX.XXXXX.com/",
			"rest": "XXXX/XXXX",
			"headers": {
				"token":"{{pre.token}}"
			},
			"param":{
				"phoneNumber":"XXXXXXXXXXX", 
				"password": "123456"
			}
	},
  "output":{ "msg": {"EQ":"【成功】"}, "dealer_token": {"TYPE":"str"}, "business_type_id": {"EQ":4}
      },
  "key": ["dealer_token"] 或者 "key": {key: value}
}

SQL范例:

{
	"sql":{
	        "db":"dbpos",
	        "command": [
                "delete from 表名 where id = {{key.uid}}",
                "delete from 表名 where user_id = {{key.uid}}",
                "delete from 表名 where user_id = {{key.uid}}",
                "delete from 表名 where user_id = {{key.uid}}",
                "delete from 表名_record where user_id = {{key.uid}}"
            ]
            }
}

如果有select出现需要保存数据时,范例:

{
	"sql":[
		"select id from 表名 where mobile = {{pre.User1}}"
	],
	"key": ["id"]
}

2.参数详解

其中input是接口请求的部分,包括请求的地址(url+rest), headers在这里是会带上用户或商户登录后产生的token。 param为请求报文。

output这里是为了检查每个返回值的类型/具体值/或者其他定义的校验值。如不需要校验可以不带或为空对象 可以直接具体到每个值
例如:

{
	"input":{
			"method": "GET",
			"url":"{{pre.XXXX_url}}",
			"rest": "ja/v1/test/sms/regist?",
			"headers":{"client": "android",
                        "Content-Type": "application/json"
				},
			"param":{
				"phone":"{{pre.User1}}", "code": "{{key.code}}"
			}
	},
  "output":{"code": {"ALLIN":[0,"1234"]},"msg":{"TYPE":"str"}, "data":{"TYPE":"dict"},"data.code":{"EQ":"1234"} },
  "key":{"code":"data.code"},   # 将data.code返回保存为key值为code
  "sleep":5
}

{{pre.token}}:指的是在TestData/项目名_data文件中的preData数组里的变量值,用于保存一些可以重复使用的变量,例如token,url {{key.code}}:指的是调用在本次执行的test cases中前几个测试步骤保存的ke值
key:为在当前步骤需要保存的某个返回key值对应的value, 如果保存之前已经有当前key值存在,当前的key,value对会被更新替换。如不需要保存key可以 不带此健或为空。
"sleep":5:指的是睡眠5秒

四.测试用例文件名命名:

1.TestCase//项目名称//平台端//功能模块//测试用例名称

项目名称:EATOJOY等等
平台端:BACKEND(后台),VENDOR(商家端)看项目情况而视,做到能区分自己在写哪一部分的测试用例即可
功能模块:LOGIN(登录模块),PAY(支付模块)方便大家寻找这是哪个功能模块的测试用例
测试用例名称:LOGIN_001_登录正确的用户_异常/正常 也是为了方便大家看懂这个测试用例的意思

2.测试步骤文件命名

001.json,002.json严格按照数字大小区分测试步骤顺序

五.新项目使用:

1.配置项目数据Config

  • 命名:项目名_环境.ini
    如E肚仔测试test环境:eatojoy_test.ini
  • 模块:project_info,test_db,email_info,url
  • 代码内调用配置
  • [test_link]需要设置testlink的测试计划(testplan),测试版本(build),测试平台(platform),测试项目(project) 举例:
from Config import config
config.ReadConfig.get_project("version")

2.配置业务测试数据TestData

  • 命名:项目名_data.py
    如E肚仔:eatojoy_data.py
  • 创建一个preData字典,通过preData["xxx"]读取
  • 项目名_dataReady.py 项目运行前创建数据

3.配置公用模块函数ProjectPublic

  • 命名:项目名Public.py
    如E肚仔:EatojoyPublic.py
  • 模块:创建一个class,通过调用class的静态方法@staticmethod,如EatojoyPublic

4.编写用例TestCase

1.覆盖接口文档中能实现接口自动化的接口 2.没有充裕的时间可以只覆盖所有接口能够请求成功的用例,有充裕的时间可以对接口进行一些参数的异常值分析,但是重要业务的接口要覆盖所有的情况,比如说支付,就要写UUU的用例,支付失败的用例,重复支付的用例,超时支付的用例(就是不单单只写UUU的用例) 例如: XXX参数为0,XXX参数为-1,XXX参数为int值的最大值,XXX参数为int值的最小值,XXX参数为int值的最大值+1,XXX参数为int值的最小值-1,XXX参数为float类型,XXX参数为string类型,XXX参数为空,XXX参数为空格等等 3.尽量更多的覆盖到所有的业务场景,例如某个接口有一个参数有多种类型,就要把所有类型都走一遍 例如: 商家拒单类型为:其他原因,商家拒单类型为:商家备料不足,商家拒单类型为:商家暂停营业,商家拒单类型为:商家订单超载,商家拒单类型为:无法按时出餐,商家拒单类型为:用户要求取消订单等等

5.公共函数

1.公共函数的执行 001.json:

无参数版本
{

"public": 

 [
 {
 "class": "ProjectPublic.HotelPublic.HotelPublic",

 "function": "GetCodeLogin"

 }

 ]
 }
有参数版本
{

"public": 

 [
 {
 "class": "ProjectPublic.HotelPublic.HotelPublic",

 "function": "GetCodeLogin"
,
 "arg":"参数"
 }

 ]
 }

上述描述的是执行的是公共函数,在ProjectPublic//HotelPublic路径下的HotelPublic类class的GetCodeLogin方法 另外一种写法,可以与http接口混合在还一起 001.json:

{
 "public": 

 {
 "class": "ProjectPublic.HotelPublic.HotelPublic",

 "function": "GetCodeLogin"

 }
,
 "input": {
 	"method": "POST",
 	"url": "{{pre.hotel_url}}",
 	"rest": "/reserve",
 	"headers": {
 		"Content-Type": "application/json",
         "client": "IOS",
         "token": "{{key.token}}"
 	},
 	"param": {
 		"hotel_id": "{{pre.hotel_id}}",
 		"room_type_id": "{{pre.room_type_id}}",
         "num": 1,
         "start": "{{pre.hotel_date_start}}",
         "end": "{{pre.hotel_date_end}}",
         "linkman": "钟祥慎",
 		"is_me": 0
 	}
 },"key":{"order_id":"data.orderSn"}
 }

2.创建函数的执行 001.json:

无参数版本
{

"new": 

 [
 {
 "class": "Common.util",

 "function": "random_11int"
,
 "key":"[phone]"
 }

 ]
 }
有参数版本
{

"new": 

 [
 {
 "class": "Common.util",

 "function": "random_11int"
,
,
 "key":"[phone]",
 "arg":"参数"
 }

 ]
 }

上述描述的是执行的是创建相关key值函数,在Common//util路径下的random_11int方法返回的值保存在phone中, 在接下来的用例中使用{{key.phone}}调用 另外一种写法,可以与http接口混合在还一起

001.json:

   {

  "new": 

 [
 {
 "class": "Common.util",

 "function": "random_11int"

,
 "key":"[phone]"
 }

 ]
 },
 "input": {
 	"method": "POST",
 	"url": "{{pre.hotel_url}}",
 	"rest": "/reserve",
 	"headers": {
 		"Content-Type": "application/json",
         "client": "IOS",
         "token": "{{key.token}}"
 	},
 	"param": {
 		"hotel_id": "{{pre.hotel_id}}",
 		"room_type_id": "{{pre.room_type_id}}",
         "num": 1,
         "start": "{{pre.hotel_date_start}}",
         "end": "{{pre.hotel_date_end}}",
         "linkman": "钟祥慎",
 		"is_me": 0
 	}
 },"key":{"order_id":"data.orderSn"}
 }

About

api automaitiontest

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages

Morty Proxy This is a proxified and sanitized view of the page, visit original site.