案例故事:Android手机音视频图片解码播放测试,有将近上千条用例,
包含了不同的音视频图片文件,每条用例都至少对应了一个测试资源文件。
整个测试资源仓库,将近100G,一些视频比如High Profile 5.2规格的,一个就500M,
如果每次测试都需要adb push导入这么多测试资源文件到系统,很费时间,
且系统加载这么多媒体文件,经常出现卡死,反应不过来的情况。


其实每一轮的测试重点及对应的测试用例是不同的,
如果只挑选出当前待测试用例的测试资源文件,则可以减少adb push导入的时间,
也可以减少系统因加载过测试资源媒体文件而出现的卡死反应慢等问题,
所以我们要根据测试用例,选择性的导入测试资源到Android系统!


准备阶段
  1. 所有的媒体文件应该存放在一个总的“仓库”下,比如All_Resources文件夹下。
    《自拍教程75》Python 根据测试用例选择测试资源 Python 第1张
  2. 测试用例的Excel表格里,至少是需要有一列用于标记每个用例对应“测试资源”
    《自拍教程75》Python 根据测试用例选择测试资源 Python 第2张
  3. 只要解析测试用例Excel表格里的标记的“媒体测试文件夹”,然后去All_Resources文件夹里对应匹配,匹配成功的,复制到一个Target_Resources文件夹下。

Python批处理脚本形式

记住批处理脚本的精髓:批量顺序执行语句,
以下脚本,All_Resource文件夹必须和Python脚本在同一个路径下。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
# coding=utf-8

import os
import shutil
import openpyxl

# 定义常量
TESTCASE_EXCEL = "TestCase.xlsx"  # 测试用例文件
CASE_RESOURCE_COL = 7

curdir = os.getcwd()

# 测试资源总仓库文件夹
all_resource_folder = os.path.join(curdir, "All_Resources")

# 目标资源文件夹, 即输出文件夹
target_resource_folder = os.path.join(curdir, "Target_Resources")

# 如果没有Target_Resources这个文件夹,则创建这个文件夹
if not os.path.exists(target_resource_folder):
    os.mkdir(target_resource_folder)

# 先删除Target_Resource这个文件夹下的所有文件,确保每次这个文件夹每次都是根据最新的用例生成的。
shutil.rmtree(target_resource_folder)

wb = openpyxl.load_workbook(TESTCASE_EXCEL)
ws = wb.active
rows = ws.max_row

for i in range(2, rows + 1):
    case_folder = ws.cell(row=i, column=CASE_RESOURCE_COL).value  # 遍历第7列
    resource_folder_path = os.path.join(all_resource_folder, case_folder)
    target_folder_path = os.path.join(target_resource_folder, case_folder)
    if os.path.exists(resource_folder_path):
        # 复制文件夹
        shutil.copytree(resource_folder_path, target_folder_path)

print("测试资源已经复制到%s文件夹下了" % target_resource_folder)
os.system("pause")

Python面向过程函数形式

以下脚本,可自定义修改用例Excel文件,且可自定义All_Resources文件夹的路径,
没说一定要本Python脚本在同一个路径下,其代码可重塑性,比批处理脚本形式更强。

# coding=utf-8

import os
import shutil
import openpyxl

# 定义常量
CASE_RESOURCE_COL = 7


def select_resource_by_case(case_excel, resource_path):
    '''根据测试用例挑选测试资源'''

    # 定义用于存放模板资源文件的文件夹'''
    target_resource_folder = os.path.join(curdir, "Target_Resources")

    # 如果没有Target_Resources这个文件夹,则创建这个文件夹
    if not os.path.exists(target_resource_folder):
        os.mkdir(target_resource_folder)

    # 先删除Target_Resource这个文件夹下的所有文件,确保每次这个文件夹每次都是根据最新的用例生成的。
    shutil.rmtree(target_resource_folder)

    wb = openpyxl.load_workbook(case_excel)
    ws = wb.active
    rows = ws.max_row

    for i in range(2, rows + 1):
        case_folder = ws.cell(row=i, column=CASE_RESOURCE_COL).value  # 遍历第7列
        resource_folder_path = os.path.join(resource_path, case_folder)
        target_folder_path = os.path.join(target_resource_folder, case_folder)
        if os.path.exists(resource_folder_path):
            # 复制文件夹
            shutil.copytree(resource_folder_path, target_folder_path)
    print("测试资源已经复制到%s文件夹下了" % target_resource_folder)


# 其实测试资源总仓库文件夹的Path是可以自定义的
curdir = os.getcwd()

# 测试资源总仓库文件夹
all_resource_folder = os.path.join(curdir, "All_Resources")  

select_resource_by_case("TestCase.xlsx", all_resource_folder)
os.system("pause")

Python面向对象类形式

以下脚本,可自定义修改用例Excel文件,且可自定义All_Resources文件夹的路径,
没说一定要本Python脚本在同一个路径下,且相对与面向过程函数形式,
其还可以单独再拎出一个函数来:self.create_target_folder()函数,
但是面向过程函数形式,是无法拎出这么一个函数来的,因为target_resource_folder变量无法作用于2个不同函数。
而面向对象类形式,self.target_resource_folder可作用于类内的各个函数。

# coding=utf-8

import os
import shutil
import openpyxl

# 定义常量
CASE_RESOURCE_COL = 7


class ResourceSelecter(object):
    def __init__(self, resource_path):
        self.resource_path = resource_path
        self.target_resource_folder = None
        self.create_target_folder()

    def create_target_folder(self):
        '''创建用于存放模板资源文件的文件夹'''
        self.target_resource_folder = os.path.join(os.getcwd(), "Target_Resources")

        # 如果没有Target_Resources这个文件夹,则创建这个文件夹
        if not os.path.exists(self.target_resource_folder):
            os.mkdir(self.target_resource_folder)

        # 先删除Target_Resource这个文件夹下的所有文件,确保每次这个文件夹每次都是根据最新的用例生成的。
        shutil.rmtree(self.target_resource_folder)

    def select_resource_by_case(self, case_excel):
        '''根据测试用例挑选测试资源'''
        wb = openpyxl.load_workbook(case_excel)
        ws = wb.active
        rows = ws.max_row

        for i in range(2, rows + 1):
            case_folder = ws.cell(row=i, column=CASE_RESOURCE_COL).value  # 遍历第7列
            resource_folder_path = os.path.join(self.resource_path, case_folder)
            target_folder_path = os.path.join(self.target_resource_folder, case_folder)
            if os.path.exists(resource_folder_path):
                # 复制文件夹
                shutil.copytree(resource_folder_path, target_folder_path)
        print("测试资源已经复制到%s文件夹下了" % self.target_resource_folder)


if __name__ == '__main__':
	# 测试资源总仓库文件夹
    all_resource_folder = os.path.join(os.getcwd(), "All_Resources")  
    r_obj = ResourceSelecter(all_resource_folder)
    r_obj.select_resource_by_case("TestCase.xlsx")
    os.system("pause")

练手素材下载

包括:

  1. 一个All_Resources测试资源文件夹
  2. 两份测试用例,不同的用例,可以生成不同的测试资源在Target_Resources文件夹内
  3. 一个select_resource.py脚本
    跳转到自拍教程官网下载
    武散人出品, 请放心下载并使用。

运行方式
  1. 从服务器里导出测试用例文件,或者本来的测试用例Excel文件
  2. 确保导出来的测试用例有一列“测试资源”,并对每个用例做了测试资源文件夹的标记
  3. 必要的话修改“测试资源”列号,修改测试用例Excel文件名,修改All_Resources资源文件夹路径
  4. 保存为select_resource.py, 双击运行或者python select_resource.py运行
  5. 则最终你会在当前路径下看到一个Target_Resources文件夹生成,内含当前这份测试用例需要用到测试资源。

小提示:其实All_Resources文件夹,可以是本地的,也可以是局域网网络的共享文件夹,
之前我们项目将全部的测试资源,都放到了//sharefolder/All_Resources路径下,
经过测试,可以从以上网络共享文件夹里成功取出资源文件来。

更多更好的原创文章,请访问官方网站:www.zipython.com
自拍教程(自动化测试Python教程,武散人编著)
原文链接:https://www.zipython.com/#/detail?id=e19b40b9835c4cdb94d453dae834cb71
也可关注“武散人”微信订阅号,随时接受文章推送。
《自拍教程75》Python 根据测试用例选择测试资源 Python 第3张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄