 点击上方“蓝字”关注我们了解更多精彩
点击上方“蓝字”关注我们了解更多精彩 案例一介绍
案例一介绍现在有一批电商产品跟当日销量的数据,如下,总共有上万笔的数据,现在需要统计每个品牌当日的销售量,比如美宝莲今天总共卖出了多少的商品,另外需要统计每个品牌下面的每个子品类当日销售量(品类可分为口红、睫毛膏、粉底等),比如卡姿兰口红卖了多少、眉笔卖了多少。

首先是要做出关键字码表,如下,这些是透过电商常用的产品称呼和观察发现的,需要对商品名称有一定的了解,比如欧莱雅的洁面膏其实就是洗面奶

后面就是建立一个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)
 戳“阅读原文”我们一起变可爱
戳“阅读原文”我们一起变可爱