zoukankan      html  css  js  c++  java
  • 从接口自动化测试框架设计到开发(一)操作、重构excel

    1.如何设计一个接口自动化测试框架

    接口测试用例一般模板

     重点考虑字段:

     

    框架需要的模板

     2.操作excel

    1.为什么要学Excel

    存测试数据

          有时候有大批量的数据,存到TXT文件里面显然不是最佳的方式,我们可以存到Excel里面去,第一方便我们存数据和做数据,另一方面方便我们读取数据,比较明朗。测试的时候就从数据库中读取出来,这点是非常重要的。

    存测试结果

    可以批量把结果存入到Excel中,也是比较好整理数据点,比我们的TXT要好。

    2.安装

    xlrd模块是读取excel
    xlwt模块是写excel
    xlutils是用来修改exce

    读取

    pip install xlrd

    excel中计数都是第0张表、第1张表、第0行、第1行、第0列、第1列开始计数的

    import xlrd
    book = xlrd.open_workbook('C:/Users/xxx.xlsx') #打开一个excel,根据excel文件格式写后缀
    sheet = book.sheet_by_index(0) #根据顺序获取sheet,0表示第一个sheet  也可以用sheet = book.sheets()[0]
    sheet2 = book.sheet_by_name('填表说明') #根据sheet页名字获取sheet
    print(sheet.cell(0,0).value) #指定行和列获取数据,0行0列代表excel中第一个数据
    print(sheet.ncols) #获取excel里面有多少列
    print(sheet.nrows) #获取excel里面有多少行
    print(sheet.row_values(0)) #取第几行的数据,返回一个列表list
    print(sheet.col_values(1)) #取第几列的数据,返回一个列表list
    #获取excel中所有的数据
    for i in range(sheet.nrows): # 获取excel中有多少行
         print(sheet.row_values(i))
         #print(' '.join([str(x) for x in sheet.row_values(i)])) #转换str
    import xlrd
    wb = xlrd.open_workbook('test.xlsx') #打开一个workbook
    
    wb.sheet_names() #获取所有的sheet name
    >>> wb.sheet_names()
    [u'Sheet1', u'Sheet2', u'Sheet3']
    
    wb.nsheets #获取sheet 数量
    >>> wb.sheet_names()
    [u'Sheet1', u'Sheet2', u'Sheet3']
    
    wb.sheets() #获取所有sheet 对象
    >>> wb.sheets()
    [<xlrd.sheet.Sheet object at 0x000000000503F390>, <xlrd.sheet.Sheet object at 0x000000000503F438>, <xlrd.sheet.Sheet object at 0x000000000503F4E0>]
    
    
    wb.sheet_by_name('Sheet1') #通过sheet名字查找
    >>> wb.sheet_by_name('Sheet1')
    <xlrd.sheet.Sheet object at 0x000000000503F390>
    
    wb.sheet_by_index(0) #通过index查找
    >>> wb.sheet_by_index(0)
    <xlrd.sheet.Sheet object at 0x000000000503F390>
    
    
    ws = wb.sheet_by_name('Sheet1')
    ws.nrows #总行数
    ws.ncols #总列数
    
    
    ws.row_values(0,3,4) #获取第1行,第3~4列的值(不包含4)
    ws.col_values(0,1,3) #获取第1列,第1~3行的值(不包含3)
    
    ws.row(0)[0].value #获取第0行,第1列的值
    ws.col(0)[0].value #获取第1列,第0行的值
    
    ws.cell(0,2).value #获取特定单元格的值

    写入

    流程:创建excel-->添加sheet页-->写入数据-->保存

    import xlwt #导模块
    book = xlwt.Workbook() #新建一个excel
    sheet = book.add_sheet('sheet1') #添加一个sheet页
    sheet.write(0,0,'姓名')#一行一行写入
    sheet.write(0,1,'性别')
    sheet.write(0,2,'年龄')
    book.save('D:pythonExcel.xls') #微软的office不能用xlsx结尾的,wps随意
    #批量写入数据
    stus = [
          ['姓名','年龄','性别','分数'],
          ['mary', 20, '', 89.9],
          ['mary', 20, '', 89.9],
          ['mary', 20, '', 89.9],
          ['mary', 20, '', 89.9]
            ]
    book = xlwt.Workbook()  #新建一个excel
    sheet = book.add_sheet('info')  #添加一个sheet页
    raw=0       #控制行
    for stu in stus:      #循环写入
        col=0    #控制列
        for s in stu:
            sheet.write(raw,col,s)
            col+=1
        raw+=1
    book.save('D:Excel.xls')
    import xlwt
    wb = xlwt.Workbook(encoding='utf-8') #新建一个workbook
    wb.save('test.xlsx') #保存
    
    
    ws = wb.add_sheet('Sheet2') #新建一个sheet2
    ws.write(0,0,'value') #向第1行,第1列写入值
    
    style = xlwt.XFStyle() #新建一个style
    font = xlwt.Font() #新建一个font
    font.name = 'Times New Roman' #设定字体
    font.bold = true #黑体
    font.underline = ture #下划线
    font.italic = ture #斜体
    style.font = font #设定style
    
    ws.write(0,0,'value',sytle) #带样式写入值
    
    
    #日期
    style = xlwt.XFStyle()
    
    style.num_format_str = 'M/D/YY'
    # 其它的格式还有: D-MMM-YY, D-MMM, MMM-YY, h:mm, h:mm:ss, h:mm, h:mm:ss, M/D/YY h:mm, mm:ss, [h]:mm:ss, mm:ss.0
    
    ws.write(0, 0, datetime.datetime.now(), style)
    
    #公式
    ws.write(1, 1, xlwt.Formula('SUM(A1,B1)'))
    
    #超连接
    ws.write(0,0,xlwt.Formula('HYPERLINK(http://www.baidu.com)'))
    
    
    合并单元格
    ws.write_merge(0,1,0,3,'value') #合并第1行,第2行的第1列,第4列,并写入值‘value’
    
    对齐
    alignment = xlwt.Alignment() # 新建一个 Alignment alignment.horz = xlwt.Alignment.HORZ_CENTER
    # 其它的格式还有 HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER, HORZ_RIGHT, HORZ_FILLED, HORZ_JUSTIFIED, HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED
    
    alignment.vert = xlwt.Alignment.VERT_CENTER
    #其它的格式还有 May be: VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED
    
    style = xlwt.XFStyle()
    style.alignment = alignment
    ws.write(0, 0, 'value', style)
    
    
    边框
    borders = xlwt.Borders()
    borders.left = xlwt.Borders.DASHED
    #DASHED:虚线;NO_LINE:没有;THIN实线
    style = xlwt.XFStyle()
    style.borders = borders
    worksheet.write(0, 0, 'value', style)
    
    背景颜色
    pattern = xlwt.Pattern()
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
    pattern.pattern_fore_colour = 0 #前景色
    pattern.pattern_back_colour = 1 #背景色
    style = xlwt.XFStyle()
    style.pattern = pattern
    ws.write(0, 0, 'value', style)

    修改excel

    流程:拷贝原来的excel-->获取sheet页-->写入修改数据-->保存

    from xlutils.copy import copy #倒模块
    book1 = xlrd.open_workbook('D:Excel.xls') #打开要修改的excel
    book2 = copy(book1) #拷贝一份原来的excel
    sheet = book2.get_sheet(0) #获取第几个sheet页
    sheet.write(1,3,0) #写入需要修改的行、列及修改后的值
    sheet.write(1,0,'小黑')
    book2.save('D:Excel.xls')

    3.重构操作excel

    import xlrd
    class OperationExcel:
        """
    docstring for ClassName 构造函数__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法 self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数 """
    def __init__(self, file_name=None,sheets_id=None): #把文件名和id默认为none,可以不传 if file_name: #如果传了文件名就使用它 self.file_name = file_name self.sheets_id = sheets_id else: self.file_name = 'D:/Excel.xls' #没有传文件名就用这个默认的文件和id self.sheets_id = 0 self.data = self.get_data() #把获取到的表单内容赋给data

    #获取sheets的内容 def get_data(self): data = xlrd.open_workbook(self.file_name) tables = data.sheets()[self.sheets_id] return tables
    #获取单元格的行数 def get_lines(self): tables = self.data return tables.nrows
    #获取单元格的列数 def get_cells(self): tables = self.data return tables.ncols
    #获取单元格的内容 def get_cell_value(self,row,col): tables = self.data.cell_value(row,col) return tables
    if __name__ == '__main__': operas = OperationExcel() #实例化 print(operas.get_cell_value(1,2)) #调用方法,获取第2行第2列 print(operas.get_lines()) #调用方法,获取行数 print(operas.get_cells()) #调用方法,获取列数 print(operas.get_data()) #调用方法,获取表单

    扩展:另一个可以用来操作excel的库:openpyxl

    openpyxl三步走

    • 获取work book
    • 获取 work sheet
    • 再然后 获取单元格 进行操作
    • 保存文件

    ps : 获取位置的时候pos可以用pos = 'A'+ int 但是加的那个数字不能是 0 不然会报错

    from openpyxl import Workbook, load_workbook
    
    
    wb = load_workbook('test.xlsx')#打开一个workbook,如果是只读的操作,最好加上data_only = True,否则,有些用函数,例如sum计算出来的值就会显示公式而不是内容
    readonly = True,否则,打开大文件的时候会很慢
    
    wb = Workbook() #新建一个workbook
    
    wb.save('C:\test.xlsx') #保存
    
    #操作sheet
    ws = wb.active 或者ws.get_active_sheet() #调用正在运行的工作表
    wb.sheetnames #获取所有的sheet(列表)
    ws = wb.sheetnames[0] #索引获取sheet
    ws = wb.get_sheet_by_name('Sheet1') 同ws=wb['Sheet1'] #获取指定的sheet
    ws = wb.create_sheet('mysheet',0) #创建sheet,0指定位置,默认插在指定位置的后面
    wb.remove_sheet(wb['Sheet1']) #删除sheet
    ws.title = 'New Title' 设定sheet的名字
    source = wb['Sheet1']
    target = wb.copy_worksheet(source) #复制sheet
    
    
    操作单元格
    print wb['Sheet1']['A1'].value #打印Sheet1的A1单元格的值
    print wb.sheetnames #列表打印所有的sheet的name
    ws.rows 同 ws.iter_rows() #打印所有行(生成器)
    ws.columns 同ws.iter_cols()#打印所有列(生成器)
    ws['A'] #A那一列(元组)
    ws['A:C'] #A到C列
    ws[1]#第1行(元组)
    ws[1:3] #第1到3行(元组)
    ws.cell(row = 1,column = 1).value 同 ws[1][1].value #ws[i][j]这种方法j(列号)可以为负索引,且i,j都可以为切片,即[2:3]这种格式
    
    
    ws['A1'] = 'test'#特定单元写入值
    ws.cell(row = 4,column = 2,value=‘test’) ##特定单元格写入值
    ws.append([1,2,3])##可以用列表来写入
    
    公式
    ws['A4']  =  "=SUM(A1:A3)"
    
    合并单元格
    ws.merge_cells(start_row = 2,start_column = 1,end_row = 2,end_column = 2)
    
    插入图片
    from openpyxl.drawing.image import Image
    img = Image(r'.	est.png')
    img_size=(50.50)
    img.width,img.height = img_size #设定图片大小
    ws.column_dimensions[A].width = 100
    ws.row_dimensions[1].height = 100   #修改第A列的宽度和第1行的高度
    ws.add_image(img,'A1')
    
    
    设置样式
    from openpyxl.styles import colors from openpyxl.styles import Font
    style = Font(name='宋体',color=colors.RED,italic=True,size=14) #colors='#AABBCC'也可以,Font的其它属性可以dir(Font)看到
    ws['A1'].font = font #设定指定单元格的样式
    col = ws.column_dimensions['A']
    col.font = style #设定列的样式
    row = ws.row_dimensions[1]
    row.font = style #设定行的样式
    
    颜色背景
    from openpyxl.sytels import PatternFill
    sytle = PatternFill('solid',fgColor='#AABBCC',bgColor='#DDEEFF')
    ws['A1'].fill = style #指定单元格颜色
    col = ws.column_dimensions['A']
    col.fill = style #设定列的颜色
    row = ws.row_dimensions[1]
    row.fill = style #设定行的颜色
    
    画图
    from openpyxl.chart import Series,LineChart,Reference
    chart = LineChart() #图标对象
    chart.title = '图标标题'
    chart.style = 8  #线的sytle
    data = Reference(ws,min_col=5,min_row=4,max_col=10,max_row=4) #数据
    serieobj = Series(data,title='测试') #series对象
    chart.appen(seriesobj) #series添加到chart中
    ws.add_chart(chart,'A6') #chart添加到sheet中
    import openpyxl
    # 操作excel
    wb = openpyxl.Workbook() #创建excel
    wb2 = openpyxl.load_workbook(path) #打开现有的excel
    # 创建表
    ws = wb.active #正在运行的工作表
    ws1 = wb.create_sheet() #末尾插入表
    ws2 = wb.create_sheet(0) #插在第一个位置
    ws3 = wb["New Title"] #根据名称获得表
    ws4 = wb.get_sheet_by_name("New Title") #根据名称获取表
    print wb.get_sheet_names() #得到所有工作表
    # 为表命名
    ws.title = "New Title" #创建时系统自定命名
    #循坏所有的工作表
    for sheet in wb:
        print sheet.title

    操作数据

    一个工作表被创建时,其中不包含单元格,只有当单元格被获取时才被创建
    openpyxl里第一行第一列索引为1,1(即从1开始,不是从0开始)

    # 行列数
    len(ws.rows) #行数
    len(ws.columns) #列数
    #
    c = ws['A4']
    c = ws.cell('A4')
    c = ws.cell(row = 4, column = 2)
    cell_range = ws['A1':'C2'] #使用切片获取多个单元格
    #获取多个单元格并遍历
    for row in ws.iter_rows('A1:C2'):
        for cell in row:
            print cell
    #迭代文件中所有的行
    for row in ws.rows: #取一行
        for cell in row: #一行中一个一个取
            print cell
    #得带文件中所有的列
    ws.colums
                    #
    ws['A4'] = 4
    # 有openpyxl.cell.Cell,可以直接为该单元赋值
    c.value = 'Hello,world'
    c.value = '15%' #其他类型
    c.value = datetime.datetime.now()

    保存

    # 覆盖掉原文件
    wb.save(path) 
    # True时文件保存为模板
    wb = load_workbook('doc.xlsx')
    wb.save('doc_template.xltx',as_template=True)
    # False时文件或模板保存为文件
    wb = load_workbook('doc.xltx')
    wb = load_workbook('doc_template.xltx') #或者
    wb.save('doc.xlsx',as_template.False)
  • 相关阅读:
    QT中文报错问题
    自动获取UILabel高度
    vi编辑器的使用
    命令例子
    WPF中textBlock 变色功能
    php 删除目录及子文件
    jquery autocomplete插件
    js日历选择控件
    centeros bash: ifconfig: command not found
    php 文件日志类
  • 原文地址:https://www.cnblogs.com/dydxw/p/12372579.html
Copyright © 2011-2022 走看看