点击上方“蓝字”关注我们了解更多精彩案例一介绍
首先是要做出关键字码表,如下,这些是透过电商常用的产品称呼和观察发现的,需要对商品名称有一定的了解,比如欧莱雅的洁面膏其实就是洗面奶
后面就是建立一个list,里面包含这些子品类,用这些关键字和品牌名称在商品列表逐一做匹配,比如商品里有“卡姿兰”又有“口红”的,再将符合的商品销售数量累加,输出至excel里,就可以完成统计,代码如下
现在有一批电商产品跟当日销量的数据,如下,总共有上万笔的数据,现在需要统计每个品牌当日的销售量,比如美宝莲今天总共卖出了多少的商品,另外需要统计每个品牌下面的每个子品类当日销售量(品类可分为口红、睫毛膏、粉底等),比如卡姿兰口红卖了多少、眉笔卖了多少。
首先是要做出关键字码表,如下,这些是透过电商常用的产品称呼和观察发现的,需要对商品名称有一定的了解,比如欧莱雅的洁面膏其实就是洗面奶
后面就是建立一个list,里面包含这些子品类,用这些关键字和品牌名称在商品列表逐一做匹配,比如商品里有“卡姿兰”又有“口红”的,再将符合的商品销售数量累加,输出至excel里,就可以完成统计,代码如下
import xlrdimport xlwtreadbook = xlrd.open_workbook(r'brand.xlsx')sheet = readbook.sheet_by_index(0)cols1=sheet.col_values(0)cols2=sheet.col_values(1)workbook = xlwt.Workbook(encoding='utf-8')worksheet = workbook.add_sheet('result')#建立子品类清单items = ['眉笔','口红','眉粉','眼线笔','睫毛膏','粉饼','唇彩','散粉','眼影','唇釉','腮红','BB霜','粉底液','卸妆水','隔离霜','面霜','香水']k = -1b = 0 #b是记录总数for item in items: a = 0 #a是某个子品类的数目 array = [] i = -1 k = k+1 for col in cols1: i = i + 1 if (item in col) and ('卡姿兰' in col): #商品名称里包含list里面的子品类和卡姿兰 array.append(i) for n in array: a = a+ cols2[n] print(item) print(a) b = b+a worksheet.write(k,0,item) worksheet.write(k,1,a)worksheet.write(k+1,0,'总数')worksheet.write(k+1,1,b)workbook.save('result.xls')
最后将输出的结果做图展示案例二介绍 在一个项目中我们需要对用户的终端机器进行统计,可是接口传回的数据如下图,同样是IPhone却有上万种写法,除了IPhone外,其他的安卓手机像是华为、OPPO、VIVO、小米等都有类似的情况,现在需要将这些分散的数据识别出,并加以统计
流程为:
1、用关键字对表内的内容进行查找,将包含关键字的行记录。
2、将包含关键字行第二列的数据进行加成,并且统计
3、输出到新的文档里
首先我们需要先制作一个关键字码表,如下图,我们将4大安卓机外的安卓机合计到安卓里面
接着,用xlrd读取excel,用码表内的关键字跟第一列的数据进行匹配,符合匹配的将第二列的数字加总,最后用xlwt输出到excel文件里,实现代码如下:
import xlrdimport xlwtreadbook = xlrd.open_workbook(r'phone.xlsx')sheet = readbook.sheet_by_index(0)cols1=sheet.col_values(0)cols2=sheet.col_values(1)i = -1a = 0 #记录数目array = []keywords = ['iphone', 'iPhone', '苹果', 'Iphone', 'iOS']for col in cols1: i = i + 1 for word in keywords: #匹配清单内的关键字 if word in col: array.append(i)for n in array: a = a+ cols2[n]print(a)workbook = xlwt.Workbook(encoding='utf-8')worksheet = workbook.add_sheet('test')worksheet.write(1,1,a)workbook.save('phone1.xls')
最后用EXCEL作图,就可以完成用户数据统计
案例三介绍封装一个读取用例的excel类:用来实现读取数据和写入数据的功能
cases.xlsx的测试数据:1.按行读取数据,存储在列表中
import openpyxlclass Case: #这个类用来存储用例的 __slots__ = [] #特殊的类属性,可以用来限制这个类创建的实例属性添加 可写可不写 passclass ReadExcel(object): #读取excel数据的类 def __init__(self,file_name,sheet_name): """ 这个是用来初始化读取对象的 :param file_name: 文件名 ---> str类型 :param sheet_name: 表单名 ———> str类型 """ # 打开文件 self.wb = openpyxl.load_workbook(file_name) # 选择表单 self.sh = self.wb[sheet_name] def read_data_line(self): #按行读取数据转化为列表 rows_data = list(self.sh.rows) # print(rows_data) # 获取表单的表头信息 titles = [] for title in rows_data[0]: titles.append(title.value) # print(titles) #定义一个空列表用来存储测试用例 cases = [] for case in rows_data[1:]: # print(case) data = [] for cell in case: #获取一条测试用例数据 # print(cell.value) data.append(cell.value) # print(data) #判断该单元格是否为字符串,如果是字符串类型则需要使用eval();如果不是字符串类型则不需要使用eval() if isinstance(cell.value,str): data.append(eval(cell.value)) else: data.append(cell.value) #将该条数据存放至cases中 # print(dict(list(zip(titles,data)))) case_data = dict(list(zip(titles,data))) cases.append(case_data) return casesif __name__ == '__main__': r = ReadExcel('cases.xlsx','Sheet1') data1 = r.read_data_line() print(data1)
2.按行读取数据,存储在对象中
import openpyxlclass Case: passclass ReadExcel(object): def __init__(self,filename,sheetname): self.wb = openpyxl.load_workbook(filename) self.sh = self.wb[sheetname] def read_data_obj(self): """ 按行读取数据 每条用例存储在一个对象中 :return: """ rows_data = list(self.sh.rows) # print(rows_data) # 获取表单的表头信息 titles = [] for title in rows_data[0]: titles.append(title.value) # print(titles) # 定义一个空列表用来存储测试用例 cases = [] for case in rows_data[1:]: # print(case) #创建一个Case类的对象,用来保存用例数据 case_obj = Case() data = [] for cell in case: # 获取一条测试用例数据 # print(cell.value) # data.append(cell.value) # print(data) if isinstance(cell.value,str): # 判断该单元格是否为字符串,如果是字符串类型则需要使用eval();如果不是字符串类型则不需要使用eval() data.append(eval(cell.value)) else: data.append(cell.value) # 将该条数据存放至cases中 # print(dict(list(zip(titles,data)))) case_data = list(zip(titles, data)) # print(case_data) for i in case_data: setattr(case_obj,i[0],i[1]) # print(case_obj) # print(case_obj.case_id,case_obj.data,case_obj.excepted) cases.append(case_obj) return casesif __name__ == '__main__': r = ReadExcel('cases.xlsx','Sheet1') res = r.read_data_obj() for i in res: print(i.caseid, i.excepted, i.data)
3.将测试用例封装到列表中,读取指定列的数据
import openpyxlclass Case: passclass ReadExcelZy(object): def __init__(self,filename,sheetname): self.wb = openpyxl.load_workbook(filename) self.sheet = self.wb[sheetname] # list1 参数为一个列表,传入的是指定读取数据的列,比如[1,2,3] # 每一行[1,3,5]列的数据,读取出来就作为一条测试用例,放在字典中 # 所有的用例放在列表中并且进行返回 def read_data(self,list1): """ :param list1: list--->要读取列 list类型 :return: 返回一个列表,每一个元素为一个用例(用例为dict类型) """ # 获取最大的行数 max_r = self.sheet.max_row cases = [] #定义一个空列表,用来存放所有的用例数据 titles = [] #定义一个空列表,用来存放表头 # 遍历所有的行数据 for row in range(1,max_r+1): if row != 1: #判断是否是第一行 case_data = [] #定义一个空列表,用来存放该行的用例数据 for column in list1: info = self.sheet.cell(row,column).value # print(info) case_data.append(info) # print(list(zip(titles,case_data))) case = dict(zip(titles,case_data)) #将该条数据和表头进行打包组合,作用相当于dict(list(zip(titles,case_data))) # print(case) cases.append(case) # print(cases) else: #获取表头数据 for column in list1: title = self.sheet.cell(row,column).value titles.append(title) # print(titles) return casesif __name__ == '__main__': r = ReadExcelZy("cases.xlsx","Sheet1") res = r.read_data([1,2,3]) for o in res: print(o['caseid'],o['data'],o['excepted'])
4.将测试用例封装到对象中,读取指定列的数据
import openpyxlclass Case: passclass ReadExcelZy(object): def __init__(self,filename,sheetname): self.wb = openpyxl.load_workbook(filename) self.sheet = self.wb[sheetname] # list1 参数为一个列表,传入的是指定读取数据的列,比如[1,2,3] # 每一行[1,3,5]列的数据,读取出来就作为一条测试用例,放在字典中 # 所有的用例放在对象中并且进行返回 def read_data_obj(self,list2): max_r1 = self.sheet.max_row #获取最大行数 cases = [] titles = [] #用来存放表头数据 for row in range(1,max_r1+1): if row != 1: case_data = [] for column in list2: info = self.sheet.cell(row,column).value # print(info) case_data.append(info) cases_data = list(zip(titles,case_data)) #将一条用例存到一个对象中(每一列对应对象的一个属性) case_obj = Case() for i in cases_data: # print(i) setattr(case_obj,i[0],i[1]) # print(case_obj.caseid,case_obj.excepted,case_obj.data) cases.append(case_obj) else: for column in list2: title = self.sheet.cell(row,column).value titles.append(title) return casesif __name__ == '__main__': r = ReadExcelZy("cases.xlsx","Sheet1") res = r.read_data_obj([1,2,3]) for i in res: print(i.caseid,i.data,i.excepted)
5.优化第4部分代码,将设置对象属性写在初始化方法中(封装Excel类读取数据最常用的方法)
import openpyxlclass Case: # 这个类用来存储用例的 def __init__(self, attrs): """ 初始化用例 :param attrs:zip类型——>[{key,value},(key1,value1)......] """ for i in attrs: setattr(self, i[0], i[1])class ReadExcel(object): def __init__(self, filename, sheetname): """ 定义需要打开的文件及表名 :param filename: 文件名 :param sheetname: 表名 """ self.wb = openpyxl.load_workbook(filename) self.sheet = self.wb[sheetname] def read_data_obj_new(self, list2): # 获取最大行数 max_r1 = self.sheet.max_row cases = [] # 用来存放表头数据 titles = [] for row in range(1, max_r1 + 1): if row != 1: case_data = [] for column in list2: info = self.sheet.cell(row, column).value # print(info) case_data.append(info) case = list(zip(titles, case_data)) # 新建对象时,将对象传给Case类 case_obj = Case(case) # print(case_obj.caseid,case_obj.excepted,case_obj.data) cases.append(case_obj) else: # 获取表头 for column in list2: title = self.sheet.cell(row, column).value titles.append(title) if None in titles: raise ValueError("传入的表头的数据有显示为空") return casesif __name__ == '__main__': r = ReadExcel('cases.xlsx', 'Sheet1') res1 = r.read_data_obj_new([1, 2, 3]) for i in res1: print(i.caseid, i.data, i.excepted)
完整流程的代码
一、将测试数据参数化
import unittestfrom python.register_new.register import registerfrom python.register_new.register_testcase_new import RegisterTestCasefrom HTMLTestRunnerNew import HTMLTestRunnerclass RegisterTestCase(unittest.TestCase): # 初始化测试用例 def __init__(self,modethod_name,excepted,data): # modethod_name 测试用例方法名 super().__init__(modethod_name) # excepted 测试用例的预期结果 self.excepted = excepted # data 测试用例参数值 self.data = data def setUp(self): print("准备测试环境,执行测试用例之前会执行此操作") def tearDown(self): print("还原测试环境,执行完测试用例之后会执行此操作") def test_register(self): res = register(*self.data) try: self.assertEquals(self.excepted,res) except AssertionError as e: print("该条测试用例执行未通通过") raise e else: print("该条测试用例执行通过")# 创建测试套件suite = unittest.TestSuite()# 将测试用例添加至测试套件中case = [{'excepted':'{"code": 1, "msg": "注册成功"}','data':'('python1', '123456','123456')'}, {'excepted':'{"code": 0, "msg": "两次密码不一致"}','data':'('python1', '1234567','123456')'}]for case in cases: suite.addTest(RegisterTestCase('test_register',case['excepted'],case['data']))# 执行测试套件,生成测试报告with open("report.html",'wb') as f: runner = HTMLTestRunner( stream = f, verbosity = 2, title = 'python_test_report', description = '这是一份测试报告', tester = 'WL' ) runner.run(suite)
二.将调用封装好的Excel类的完整代码流程
import unittestfrom python.register_new.register import registerfrom python.register_new.register_testcase_new import RegisterTestCasefrom HTMLTestRunnerNew import HTMLTestRunnerfrom python.readexcel import ReadExcelclass RegisterTestCase(unittest.TestCase): # 初始化测试用例 def __init__(self, modethod_name, excepted, data): # modethod_name 测试用例方法名 super().__init__(modethod_name) # excepted 测试用例的预期结果 self.excepted = excepted # data 测试用例参数值 self.data = data def setUp(self): print("准备测试环境,执行测试用例之前会执行此操作") def tearDown(self): print("还原测试环境,执行完测试用例之后会执行此操作") def test_register(self): res = register(*self.data) try: self.assertEquals(self.excepted, res) except AssertionError as e: print("该条测试用例执行未通通过") raise e else: print("该条测试用例执行通过")# 创建测试套件suite = unittest.TestSuite()# 调用封装好的读取数据的Excel类,获取测试数据r1 = ReadExcel('cases.xlsx', 'Sheet1')cases = r1.read_data_obj_new([2, 3])# 将测试用例添加至测试套件中for case in cases: # 需要使用eva()函数对except和data进行自动识别 suite.addTest(RegisterTestCase('test_register', eval(case.excepted), eval(case.data)))# 执行测试套件,生成测试报告with open("report.html", 'wb') as f: runner = HTMLTestRunner( stream=f, verbosity=2, title='python_test_report', description='这是一份测试报告', tester='WL') runner.run(suite)
微信号:lost-fawn新浪微博:青衫已旧伊人犹在-扫码关注我们-戳“阅读原文”我们一起变可爱