接口自动化(四):框架搭建(Python)

测试脚本:

测试脚本,和我前几期讲的差不多,就是发请求,断言,不过这里有个新东西和大家说下,就是sessionID 问题,因为实际工作中有好多请求就是依赖这些东西,我这里是更新用户信息,需要用户登录返回来的 sessionID ,直接上代码:

import os

from HTMLTestRunner import HTMLTestRunner

import requests

import unittest

import csv

class test_updateuser_v3(unittest.TestCase):

#unittest 框架中 setUp 方法是在每个测试 case 前都执行一遍

    def setUp(self):

    # 获取当前路径,如果路径混乱时,大家可以 print 打印去调试

        path = os.getcwd()

        # 一个点上一级 两个点上上一级

        p1 = os.path.abspath(os.path.dirname(path) + os.path.sep + ".")

        self.fpath = p1 + "\\testdatafile\ind_interface\\test_updateuser.csv"

        print(self.fpath)

        self.file = open(self.fpath, 'r')

        table = csv.reader(self.file)

        userinfo = {}

         拿到登录的用户名和登录密码,所以这里参数写死掉了

        for row in table:

            url = row[0]

            userinfo[row[3]] = row[4]

            userinfo[row[5]] = row[6]

            break

        response = requests.post(url, data=userinfo)

       # 拿到登录返回来的 jsessionid

        self.sessionID = dict(response.cookies)['JSESSIONID']

        self.file.close()

        # 更新用户信息, unittest 框架中测试方法必须以 test 开头

    def test_03(self):

        self.file2 = open(self.fpath, 'r')

        # 这里为什么是 num=0 呢,是因为文件的第一行是登录请求 url, 所以我第一行要跳过,下面做判断用

        num = 0

        table = csv.reader(self.file2)

        for row in table:

            userinfo = {}

            # 第一行就跳过了

            num = num + 1

            if num > 1:

            # 拿到 url

                url = row[0]

               # 拿到参数个数,类似我前几篇方法一样,我就不一一解释了

                j = int(row[2])

                expresult = row[1]

                for i in range(3, 2 * j + 3, 2):

                    userinfo[row[i]] = row[i + 1]

                # print(userinfo)

                session = {'JSESSIONID': self.sessionID}

                # 这里多了 cookies 参数,请注意

                response = requests.post(url, data=userinfo, cookies=session).text

                print(response)

                # 这里断言:外汇跟单gendan5.com判断 response 里面是否有更新个人信息成功字段,比 if 简单多了

                self.assertIn(" 更新个人信息成功 ", response)

        self.file2.close()

该脚本放在script 目录下面的 ind_interface

启动主函数

主要记录了怎么去按照配置文件里面的标识去执行脚本:

import csv

import operator

import os

import unittest

# 这里用 HTMLTestRunner 生成报告,需要把该 python 文件放到项目目录下面

from HTMLTestRunner import HTMLTestRunner

if __name__ == '__main__':

    path = os.getcwd()

    p2 = os.path.abspath(os.path.dirname(path) + os.path.sep + ".")

    # 报告名字

    filename = p2 + "\\testresultfile\ind_interface\\test_updatauser_report.html"

    # 以二进制写报告

    report=open(filename,'wb')

    file = open('D:\Learn\\automation\interfaceframework\config\config.csv', 'r')

    # 下面注释的两行是获取配置文件里一共多少行

    # line=len(open('D:\Learn\\automation\interfaceframework\config\config.csv').readlines())

    # print(line)

    table = csv.reader(file)

    lis = []

    n = 0

    dic = {}

    for row in table:

    # 跳过第一行

        if n > 0:

            dic = {}

           # 拿到测试脚本路径,测试脚本名称

            dic[row[1]] = row[0]

            # 拿到测试顺序

            dic['num'] = row[3]

            # 拿到测试状态:即是否执行

            dic['state']=row[2]

        # print(dic)

        if dic != {}:

        # 把他们装到列表里面

            lis.append(dic)

      #n csv 行数

        n = n + 1

     # 这里是把列表按照 num 排序

    dicn = sorted(lis, key=operator.itemgetter('num'))

    # 给大家看下 dicn 结果排序内容:

    #[{'test_updateuser_v2.py': 'D:\\Learn\\automation\\interfaceframework\\script\\ind_interface', 'num': '1', 'state': 'YES'}, {'test_updateuser_v3.py': 'D:\\Learn\\automation\\interfaceframework\\script\\ind_interface', 'num': '2', 'state': 'YES'}]

    # print(dicn)

# 相当于循环配置文件了

    for i in range(0, n - 1):

        m = 0

        # 拿到字典里的值

        for content in dicn[i].items():

            if m == 0:

           # 拿到测试文件名,测试文件路径

                fname = content[0]

                fpath = content[1]

                print(fname, fpath)

            if m==2:

                state=content[1]

               # 判断是否执行该脚本

                if state=='YES':

              # 加载测试 case

                    discover = unittest.defaultTestLoader.discover(fpath, pattern=fname)

                    runner = HTMLTestRunner(stream=report, title=" 测试报告 ", description=" 更新接口 ")

                    # 执行加载的测试案例

                    runner.run(discover)

            m = m + 1

    report.close()


请使用浏览器的分享功能分享到微信等