接口测试,可以提前发现问题,保证项目质量

 

接口测试和UI测试边界

接口:搜索正确性与相关性

UI:交互流程、数据展示

 

接口本身就适合自动化属性,就不用使用postman,直接使用测试框架就可以

RobotFramework 是基于关键字封装,重构难,维护成本大,而且接触不到代码,能力没法成长

 

推荐框架

Python:Requests、HttpRunner

Java:RestAssured

 

Requests框架

功能全面:支持 http/https

使用简单:简单易用,不用关系底层细节

定制性高:借助于hook机制 完成通用处理?

 

(小公司一般用jmeter进行接口测试,不能持续集成,大公司不用;jmeter是个性能测试工具,只是可以测试接口)

 

request官网:https://requests.readthedocs.io/en/master/

 

Requests举例

from pprint import pprint
import requests

def test_requests():
    # 发起请求,get方法可以追加参数
    r = requests.get("https://ceshiren.com/")
    pprint(r)

    print(r.request)
    print(r.status_code)
   # 断言
    assert r.status_code == 200

  

get请求

 

 

post请求

 

 

post也可以传 params

 

 

文件上传

 

 

请求传cookie

 

 

相应结果断言

基本信息:

r.url  r.status_code  r.headers  r.cookies

相应结果

r.text = r.encoding + e.content

r.json() = r.encoding + r.content + content type json

r.raw.read(10)

对应的请求内容:

r.request

举例

r.json

(第二个箭头指的,因为参数会符合http规范,首字母大写,所以要去找“Header”,而不是“header”)

 

 


断言

json.dumps()用于将字典形式的数据转化为字符串,json.loads()用于将字符串形式的数据转化为字典

 

 

 循环查找式断言

 

 

 

 jsonpath断言

 

 

 

 

 

 

xml断言、xpath断言

 

 

 

 

 

 hamcrest断言:

解决复杂断言情况,比如 结果接近10的话 就判断通过,这样的情景使用assert是没法实现的

官网:http://hamcrest.org/

 

json schema断言:

Json Schema定义了一套词汇和规则,这套词汇和规则用来定义Json元数据,且元数据也是通过Json数据形式表达的。Json元数据定义了Json数据需要满足的规范,规范包括成员、结构、类型、约束等。

 

teardown和setup方法,尽量用setup

teardown风险:如果用例中途被kill掉,那么teardown是不会被执行的

 


 

接口的数据驱动

1、直接传递参数

@pytest.mark.parametrize传递参数

 @pytest.mark.parametrize("name", [
        "demo1", "中文", "中文_1", "123", "aasd", "*", " ", "😨"
    ])
    def test_delete(self, name):
        # name = "demo_4"

        # 如果有就删除
        r = self.tag.get()
        x = self.tag.jsonpath(f"$..tag[?(@.name=='{name}')]")

        if isinstance(x, list) and len(x) > 0:
            self.tag.delete(tag_id=[x[0]['id']])

        # 环境干净后开始测试
        r = self.tag.get()
        path = "$..tag[?(@.name!='')]"
        size = len(self.tag.jsonpath(path))

        # 添加新标签
        self.tag.add(name)
        r = self.tag.get()
        assert len(self.tag.jsonpath(path)) == size + 1
        tag_id = self.tag.jsonpath(f"$..tag[?(@.name=='{name}')]")[0]['id']
        print(tag_id + '-----')
        self.tag.delete(tag_id=[tag_id])
        # assert len(self.tag.jsonpath(path)) == size

  

 

 

 

 2、通过yaml文件

yaml文件:

"test_delete": ["demo1", "中文", "中文_1", "123", "aasd", "*", " ", "😨"]testcase

BaseApi:

BaseApi中:
# 封装yaml文件的加载
@classmethod
def yaml_load(self, path) -> list:
    with open(path) as f:
        return yaml.safe_load(f)

testcase:

data = BaseApi.yaml_load("test_tag.data.yaml")

@pytest.mark.parametrize("name", data["test_delete"]) def test_delete(self, name): # name = "demo_4" # 如果有就删除 r = self.tag.get() x = self.tag.jsonpath(f"$..tag[?(@.name=='{name}')]") if isinstance(x, list) and len(x) > 0: self.tag.delete(tag_id=[x[0]['id']]) # 环境干净后开始测试 r = self.tag.get() path = "$..tag[?(@.name!='')]" size = len(self.tag.jsonpath(path)) # 添加新标签 self.tag.add(name) r = self.tag.get() assert len(self.tag.jsonpath(path)) == size + 1 tag_id = self.tag.jsonpath(f"$..tag[?(@.name=='{name}')]")[0]['id'] print(tag_id + '-----') self.tag.delete(tag_id=[tag_id]) # assert len(self.tag.jsonpath(path)) == size

  

 

 

 


hook机制

对拿到的response加一些类型,从而得到新的字段,常用于 加密&解密

举例

 

 jsonpath

 

 

 

 

 

 

 

 

 

 

 

 

 

 

【接口测试--坑】

1、执行代码报错:SSLError

原因:url为https,charles证书问题,把SSL Proxying 关掉即可

 

 posted on 2020-06-15 20:07  Lverson_tester  阅读(346)  评论(0编辑  收藏  举报