介面自動化(四):框架搭建(Python)

專注的阿熊發表於2021-03-30

測試指令碼:

測試指令碼,和我前幾期講的差不多,就是發請求,斷言,不過這裡有個新東西和大家說下,就是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()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2765754/,如需轉載,請註明出處,否則將追究法律責任。

相關文章