python中操作excel文件及執行結果回寫


讀寫excel表格和結果回寫

一、需求

  • 1.將用例代碼和用例數據進行分離
  • 2.用例中的參數,和預期結果參數化處理
  • 3.用例數據放到excel中存儲
  • 4.用例執行的結果回寫到excel中

二、實現流程

  • 1.設計測試用例,excel中編寫用例數據

  • 2.定義測試用例類,編寫測試用例方法

    • 定義一個繼承於unittest的測試用例類

    • 定義一個測試用例方法(test開頭)

    • 重寫____init___方法,實現(用例參數和預期結果)參數化

    • 對斷言進行異常捕獲,出現斷言異常回寫結果測試用例執行未通過,沒有出現異常,回寫結果用例執行通過

      import unittest
      
      # 導入登錄功能函數
      from login import login_check
      from readexcel import ReadExcel
      from register import register
      excel = ReadExcel("cases.xlsx", "login")
      # 定義登錄的測試用例類
      class LoginTestCase(unittest.TestCase):
      
          def __init__(self, methodName, data, expected, case_id):
              super().__init__(methodName)
              self.data = data
              self.expected = expected
              self.case_id = case_id
      
          def test_login(self):
              # 第一步:准備用例數據
              # 1、用例的參數:
              data = self.data
              # 2、預期結果:
              expected = self.expected
      
              # 第二步:執行功能函數,獲取實際結果
              result = login_check(*data)
      
              # 第三步:比對實際結果和預期結果
              try:
                  self.assertEqual(expected, result)
              except AssertionError as e:
                  # 用例執行未通過
                  excel.write_data(row=self.case_id + 1, column=5, value="未通過")
                  raise e
              else:
                  excel.write_data(row=self.case_id + 1, column=5, value="通過")
      
  • 3.創建測試套件

    suite=unittest.TestSuite()
    
  • 4.將用例添加到套件

    • 讀取excel中的用例數據

    • 遍歷用例數據,創建用例對象

    • 將用例對象加入套件

      excel = ReadExcel("cases.xlsx", "login")
      cases = excel.read_data()
      for item in cases:
          # 通過創建對象去獲取測試用例
          case = LoginTestCase("test_login", eval(item["data"]), eval(item["expected"]))
          suite.addTest(case)
      
      
  • 5.使用HTMLTestRunnerNew創建測試運行程序

    runner = HTMLTestRunner(stream=open("report.html", "wb"),  # 打開的報告,將句柄傳給stream
                            tester="小眼睛",
                            description="報告的描述信息",
                            title="報告的標題")
    
  • 6.運行測試套件中的所有的用例,生產測試報告

    runner.run(suite)
    

三、封裝讀取和寫入excel的方法

import openpyxl

# 用來保存用例數據
class CaseData:
    pass

class ReadExcel(object):

    def __init__(self, filename, sheet_name):
        self.filename = filename
        self.sheet_name = sheet_name

    def open(self):
        """打開工作薄,選擇表單"""
        self.workbook = openpyxl.load_workbook(self.filename)
        self.sheet = self.workbook[self.sheet_name]

    def close(self):
        """關閉工作薄對象,釋放內存"""
        self.workbook.close()

    def read_data(self):
        self.open()
        # 按行獲取所有的格子
        rows = list(self.sheet.rows)
        # 獲取表頭行數據
        title = []
        for r in rows[0]:
            title.append(r.value)

        # 創建一個空列表 用來存放所有的用例數據
        cases = []
        # 遍歷除了表頭剩余的行
        for row in rows[1:]:
            # 創建一個空列表,用來存儲該行的數據
            data = []
            # 再次遍歷該行的每一個格子
            for r in row:
                # 將格子中的數據,添加到data中
                data.append(r.value)
            case = dict(zip(title, data))
            cases.append(case)
        # 關閉工作薄
        self.close()
        return cases

    def read_data_obj(self):
        self.open()
        # 按行獲取所有的格子
        rows = list(self.sheet.rows)
        # 獲取表頭行數據
        title = []
        for r in rows[0]:
            title.append(r.value)

        # 創建一個空列表 用來存放所有的用例數據
        cases = []
        # 遍歷除了表頭剩余的行
        for row in rows[1:]:
            # 創建一個空列表,用來存儲該行的數據
            data = []
            # 再次遍歷該行的每一個格子
            for r in row:
                # 將格子中的數據,添加到data中
                data.append(r.value)
            # 將表頭和數據打包轉換為列表
            case = list(zip(title, data))
            # 創建一個對象用來保存該行用例數據
            case_obj = CaseData()
            # 遍歷列表中該行用例數據,使用setattr設置為對象的屬性和屬性值
            for k, v in case:
                setattr(case_obj, k, v)
            # print(case_obj,case_obj.__dict__)
            # 將對象添加到cases這個列表中
            cases.append(case_obj)
        # 關閉工作薄
        self.close()
        # 返回cases(包含所有用例數據對象的列表)
        return cases

    def write_data(self, row, column, value):
        # 打開工作薄
        self.open()
        # 寫入數據
        self.sheet.cell(row=row,column=column,value=value)
        # 保存文件
        self.workbook.save(self.filename)
        # 關閉工作薄
        self.close()

四、運行程序

import unittest

from HTMLTestRunnerNew import HTMLTestRunner
from readexcel import ReadExcel
from testcases import LoginTestCase, RegisterTestCase

# 第一步,創建一個測試套件
suite = unittest.TestSuite()

# 第二步:將測試用例,加載到測試套件中

# 1、讀取登錄功能函數的用例數據,創建用例對象,添加到套件
excel = ReadExcel("cases.xlsx", "login")
cases = excel.read_data()
for item in cases:
    # 創建一個用例對象
    case = LoginTestCase("test_login", eval(item['data']), eval(item["expected"]), item["case_id"])
    suite.addTest(case)

# 2、讀取注冊功能函數的用例數據,創建用例對象,添加到套件
excel = ReadExcel("cases.xlsx", "register")
cases = excel.read_data()
for item in cases:
    case = RegisterTestCase("test_register", eval(item["data"]), eval(item["expected"]), item["case_id"])
    suite.addTest(case)

# 第三步:創建一個測試運行程序啟動器
runner = HTMLTestRunner(stream=open("report.html", "wb"),  # 打開一個html格式報告文件,將句柄傳給stream
                        tester="musen",  # 報告中示的測試人員
                        description="python24第二次作業報告",  # 報告中顯示描述信息
                        title="24期上課的測試報告")  # 報告中的標題

# 第四步:使用啟動器去執行測試套件
runner.run(suite)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM