数据驱动 | python读取excel&yaml文件

2019-02-25  本文已影响1人  Root_123

EXCEL

首先下载安装xlrd和xlwt这两个库。
  1、打开excel


image.png
   readbook = xlrd.open_workbook(r'\test\canying.xlsx')

2、获取读入的文件的sheet

    sheet = readbook.sheet_by_index(1)#索引的方式,从0开始
    sheet = readbook.sheet_by_name('sheet2')#名字的方式

3、获取sheet的最大行数和列数

    nrows = sheet.nrows#行
    ncols = sheet.ncols#列

4、获取某个单元格的值

    lng = table.cell(i,3).value#获取i行3列的表格值
    lat = table.cell(i,4).value#获取i行4列的表格值

5、打开将写的表并添加sheet

    writebook = xlwt.Workbook()#打开一个excel
    sheet = writebook.add_sheet('test')#在打开的excel中添加一个sheet

6、将数据写入excel

     sheet.write(i,0,result[0])#写入excel,i行0列
     sheet.write(i,1,result[1])

7、保存

     writebook.save('answer.xls')#一定要记得保存

例如:
file_reader.py

class ExcelReader:
    """
    读取excel文件中的内容。返回list。

    如:
    excel中内容为:
    | A  | B  | C  |
    | A1 | B1 | C1 |
    | A2 | B2 | C2 |

    如果 print(ExcelReader(excel, title_line=True).data),输出结果:
    [{A: A1, B: B1, C:C1}, {A:A2, B:B2, C:C2}]

    如果 print(ExcelReader(excel, title_line=False).data),输出结果:
    [[A,B,C], [A1,B1,C1], [A2,B2,C2]]

    可以指定sheet,通过index或者name:
    ExcelReader(excel, sheet=2)
    ExcelReader(excel, sheet='BaiDuTest')
    """
    def __init__(self, excel, sheet=0, title_line=True):
        if os.path.exists(excel):
            self.excel = excel
        else:
            raise FileNotFoundError('文件不存在!')
        self.sheet = sheet
        self.title_line = title_line
        self._data = list()

    @property
    def data(self):
        if not self._data:
            workbook = open_workbook(self.excel)
            if type(self.sheet) not in [int, str]:
                raise SheetTypeError('Please pass in <type int> or <type str>, not {0}'.format(type(self.sheet)))
            elif type(self.sheet) == int:
                s = workbook.sheet_by_index(self.sheet)
            else:
                s = workbook.sheet_by_name(self.sheet)

            if self.title_line:
                title = s.row_values(0)  # 首行为title
                for col in range(1, s.nrows):
                    # 依次遍历其余行,与首行组成dict,拼到self._data中
                    # 以下实例展示了zip的使用方法:
                    # >> > a = [1, 2, 3]
                    # >> > b = [4, 5, 6]
                    # >> > c = [4, 5, 6, 7, 8]
                    # >> > zipped = zip(a, b)  # 打包为元组的列表
                    # [(1, 4), (2, 5), (3, 6)]
                    # >> > zip(a, c)  # 元素个数与最短的列表一致
                    # [(1, 4), (2, 5), (3, 6)]
                    self._data.append(dict(zip(title, s.row_values(col))))
            else:
                for col in range(0, s.nrows):
                    # 遍历所有行,拼到self._data中
                    self._data.append(s.row_values(col))
        return self._data

test_baidu.py

from utils.file_reader import ExcelReader

class TestBaiDu(unittest.TestCase):
    URL = Config().get('URL')
    excelfile = DATA_PATH + '/baidu.xlsx'

    def sub_setUp(self):
        self.page = BaiDuMainPage(browser_type='chrome').get(self.URL, maximize_window=False)

    def sub_tearDown(self):
        self.page.quit()

    def test_search(self):
        datas = ExcelReader(self.excelfile).data
        for d in datas:
            with self.subTest(data=d):    #在测试用例中使用subTest()重复测试某个用例,其没有setup和teardown,需手动添加
                self.sub_setUp()
                self.page.search(d['search'])
                time.sleep(2)
                self.page = BaiDuResultPage(self.page)  # 页面跳转到result page
                links = self.page.result_links
                for link in links:
                    logger.info(link.text)
                self.sub_tearDown()

YAML

导入yaml包
file_reader.py

import yaml

class YamlReader:
    def __init__(self,yamlfile):
        if os.path.exists(yamlfile):
            self.yamlfile=yamlfile
        else:
            raise FileNotFoundError("文件不存在!")
        self._data=None

    @property
    def data(self):
        # 如果是第一次调用data,读取yaml文档,否则直接返回之前保存的数据
        if not self._data:
            with open(self.yamlfile, 'rb') as f:
                self._data = list(yaml.safe_load_all(f))  # load后是个generator,用list组织成列表
        return self._data

config.py读取配置

import os
from utils.file_reader import YamlReader

class Config:
    def __init__(self, config=CONFIG_FILE):
        self.config = YamlReader(config).data

    def get(self, element, index=0):
        """
        yaml是可以通过'---'分节的。用YamlReader读取返回的是一个list,第一项是默认的节,如果有多个节,可以传入index来获取。
        这样我们其实可以把框架相关的配置放在默认节,其他的关于项目的配置放在其他节中。可以在框架中实现多个项目的测试。
        """
        return self.config[index].get(element)

最后:

description = Config().get('DESCRIPTION')    #DESCRIPTION是配置文件config.yml里的

调用就行。

上一篇下一篇

猜你喜欢

热点阅读