Postman

postman接口自动化测试

2020-07-19  本文已影响0人  阿拉伯怪

1.测试数据的分层
2.测试脚本的分层
3.测试用例的分层(场景设计)
4.工具类的定义(token、secret、datatime、name、pict for testdata)
5.数据驱动的管理(newman改造,数据服务化)
6.接口来源(charles、fiddler、yapi、f12、bridge=>har2postman)
7.版本控制
8.测试报告的管理
9.docker+jenkins

一、测试数据的优先级(数据分层机制): postman允许用户在多个层级覆盖测试数据.png 如图展示了各种数据来源的crud,这是测试框架很好的范例.png

postman自带的Dynamic variables(随机数、日期、IP等数据的自动生成)

https://learning.postman.com/docs/writing-scripts/script-references/variables-list/
关于数据驱动的槽点(当使用csv进行数据驱动的时候,pm.iterationData.variables()读取到的value默认是string,所以当需要传输list、dictionary类型的数据时,需要作前置的search、split、参数重新赋值);
TODO:使用json文件进行参数化会是最方便的,无需做入参的规则制定和数据类型转换。最后,需要一个数据管理平台进行可视化的生成json数据的;

二、测试脚本的优先级(脚本分层机制) 如图展示了前置脚本、请求-响应、断言的优先级,具备hook,这是测试框架很好的范例.png

四、设置测试用例的执行顺序(单个场景)

postman.setNextRequest("Next Request"); 使用要点.png

1.不受前置脚本和断言脚本的限制,总之在当前脚本结束后运行
2.受当前运行的scope影响,在当前的folder或者collection中进行跳转

三、TODO: 自定义用例分层机制,实现测试用例的多场景组合;

四、公共方法的定义

//using env functions by eval
postman.setEnvironmentVariable("utils", () => {
      var myFunction1 = (x,y) => {
          return _.random(x, y);
      }
      var myFunction2 = () => {
          let func1Result = myFunction1();
          //do something else
      }
      return {
          myPackage: {
              myFunction1,
              myFunction2
          }
      };
  });
  let utils = eval(pm.environment.get(utils))();
  data = utils.myPackage.myFunction1(10,20); //calls myFunction1()
  console.log(data);
  utils.myPackage.myFunction2(); //calls myFunction2() which uses myFunction1()

测试数据的各种加密:

testdata为字符串类型;
base64加密:

var newtestdata = CryptoJS.enc.Utf8.parse(testdata);
var base64 = CryptoJS.enc.Base64.stringify(newtestdata);

md5加密:

var md5 = CryptoJS.MD5(testdata).toString();

rsa加密 => 最终获得token:

//pm.sendRequest:GET
//getting rsakey by requesting api
pm.sendRequest(pm.environment.get("url")+"/abcde", function (err, response) {
    console.log(response.json());
    pm.environment.set("rsaKey", response.json()['data']);
});

//pm.sendRequest:POST dorm-data
var public_key = '-----BEGIN PUBLIC KEY-----\n' +
    pm.environment.get("rsaKey") + '\n' +
    '-----END PUBLIC KEY-----';
console.log(public_key);

//getting rsa by requesting api
pm.sendRequest({
    url: 'https://api.bejson.com/Bejson/Api/Rsa/pubEncrypt',
    method: 'POST',
    header: {
        'Content-Type': 'multipart/form-data',
          },
    body: {
      mode: 'formdata',
      formdata: [
        {key: "publicKey", value: public_key, disabled: false, description: {content:"", type:"text/plain"}},
        {key: "encStr", value: "abcde", disabled: false, description: {content:"", type:"text/plain"}},
        {key: "etype", value: "rsa2", disabled: false, description: {content:"", type:"text/plain"}}
      ]
    }
  }, function(err, response) {
      console.log("rsa加密后", response.json());
      pm.environment.set("rsa_pwd", response.json()["data"]);
  });

//getting access_token by requesting api, username,password can be parameterized!
pm.sendRequest({
    url: pm.environment.get("url")+'/abcde',
    method: 'POST',
    header: {
        'content-type': 'multipart/form-data',
        'mock': 'true'
          },
    body: {
      mode: 'formdata',
      formdata: [
        {key: "username", value: pm.environment.get("username"), disabled: false, description: {content:"", type:"text/plain"}},
        {key: "password", value: pm.environment.get("rsa_pwd"), disabled: false, description: {content:"", type:"text/plain"}},
        // {key: "password", value: "123", disabled: false, description: {content:"", type:"text/plain"}}]
    }
  }, function(err, response) {
       console.log(response.json());
       pm.environment.set("token", response.json()["abcde"]);
  });

TODO: 由于postman的pm.request/pm.set/pm.get/pm.xx,都是异步执行。
所以,我将其分别放到request的pre-requestscript>body>Tests三个同步的步骤中执行,以此每次获取到最新的token;或者是,将多个接口请求嵌套在pm.request中,但会造成代码不优雅的情况;
另外,将这些函数方法以字符串形式封装到公共方法类,使用eval进行调用会减少代码冗余、提升复用性;
TODO:在公共方法中定义自增ID、有效的时间段、符合要求的随机数等

五、postman data-driven的坑 csv的内容.png

看不太懂的报错.png 将第一行的数字都改为a的preview效果.png 使用notepad++转码即可.png 成功后的preview效果.png TODO:由于需要维护的testdata数量众多,如每个csv都通过该方式转码效率太低,所以用python+pandas实现文件的自动转码
import os
import pandas as pd

coding = 'utf-8-sig'
dir = r'.\testdata'
file_dir = dir

def run_coding():
    for root, dirs, files in os.walk(file_dir, topdown=False):
        for i in files:
            files_name = os.path.join(root, i)
            try:
                df = pd.read_csv(files_name, encoding='gbk')

            except Exception:
                df = pd.read_csv(files_name, encoding='utf-8')

            df.to_csv(files_name, encoding=coding,index=None)
            print("ok:",files_name)

if __name__ == '__main__':
    run_coding()

六、Postman Interceptor的安装

安装chrome扩展程序+postman bridge chrome拓展程序安装后的效果.png postman bridge安装后的效果.png

bridge下载地址

双击即可.png 验证安装成功的方法:
MacOS/ Linux: $HOME/.postman
Windows: %USERPROFILE%.postman\

七、collection的版本控制

postman有版本控制是很好的点,当然,使用git来管理也是归宿

最后、postman-mixed

providing:collections+testcases+variables+environment variables+global variables+testdata's management(restful api) + report + cicd

上一篇下一篇

猜你喜欢

热点阅读