python中操作excel文件及执行结果回写

Posted blackzhou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

以上是关于python中操作excel文件及执行结果回写的主要内容,如果未能解决你的问题,请参考以下文章

Python控制Excel实现自动化办公

通过hive自定义函数直接回写数据到数据库

python之excel操作

python对excel表格数据进行分类处理!!!(图文并茂详细版!!!)

python编程:excel文件操作,redis数据库,接口开发

Python&Selenium 关键字驱动测试框架之数据文件解析