if __name__ == '__main__':
# 以只读方式打开框架的配置文件
file = open(r"D:\PythonProject\interfaceframework\config\config1.csv", "r")
table = csv.reader(file)
# line = len(open("D:\PythonProject\interfaceframework\config\config1.csv").readlines()) # 可直接读取文件行数的一种方法
# print(line)
line = 0 # 定义配置文件行数
listd = [] # 定义一个列表用来存放所有的脚本内容
for row in table: # 逐行读取配置文件
line += 1
dic = {} # 定义一个字典用来存放一行中读取的信息,放在循环内是为了每次读取下一行前都清空之前的数据
if line > 1: # 跳过第一行读取
# 把文件中读取的数据放入字典
dic[row[1]] = row[0] # 脚本文件名:脚本路径
dic["num"] = int(row[3]) # num:脚本执行顺序
# 把脚本运行状态加入字典数据
dic["state"] = row[2] # state:是否运行
# print(dic) # 读取之后dic字典就存放了3个键值{脚本文件名:脚本路径, num:脚本执行顺序, state:是否运行}
if dic != {}: # 因为前面跳过了第一行,所以第一行字典为空,这里同样也需要跳过第一行
listd.append(dic) # 将读取的每行字典内容加到列表中
# print(listd) # 查看一下前面添加的到底对不对
# print("line行数=", line)
listn = sorted(listd, key=operator.itemgetter("num")) # 用operator函数将前面的listd列表按照num从小到大排序。
print(listn) # 查看排序之后的列表
for i in range(0, line-1): # 把排序后的列表字典逐个读取
n = 0 # 定义一个n用来控制需要获取列表中的哪些内容
for content in listn[i].items(): # 把对应一组字典中的数据逐个读出
if n == 0: # 当n=0时读取文件名和文件路径
fname = content[0] # 定义fname获取文件名
fdir = content[1] # 定义fdir获取文件路径
if n == 2: # 当n=2时读取是否执行
# print(content)
state = content[1]
if state == "Yes": # 判断是否执行
# 调用脚本程序进行执行
print("最终运行的程序", fname)
discover = unittest.defaultTestLoader.discover(fdir, pattern=fname)
# 定义一个运行对象
runner = unittest.TextTestRunner()
runner.run(discover)
n = n + 1
流程图如下,便于更好的理解各种循环嵌套关系:
例2:通过os方法执行运行脚本
配置文件如下:
代码如下:
import csv, os
import operator
file = open(r"../atstudy_test_config/testconfig1.csv", "r")
table = csv.reader(file)
header = next(table) # 跳过第一行
list_tmp = [] # 定义一个空列表用来存放循环取出的所有脚本
for row in table:
dic_tmp = {} # 定义一个空字典来存放状态为run的脚本
if row[2] == "RUN":
dic_tmp["path"] = row[1]
dic_tmp["num"] = row[3]
list_tmp.append(dic_tmp) # 将取出的脚本和执行顺序以字典形式加入到列表中
print("取出执行状态为run的脚本:", list_tmp)
# 按照执行顺序排序
list_sort = sorted(list_tmp, key=operator.itemgetter("num"))
print("按执行顺序从小到大排序:", list_sort)
# 将排序后的列表中的执行脚本取出
for content in list_sort:
# print(content["path"])
strOs = ("python " + content["path"])
os.system(strOs)
任务目标:在配置文件中定义测试脚本路径,脚本名称,是否执行,执行顺序。然后从配置文件中读取测试脚本及其路径,识别该脚本是否需要执行,最后按照给定的执行顺序执行脚本。好处:框架程序不需要做任何修改,只需要修改Excel里的值就能应对任意脚本运行。配置文件如下:代码如下,每一步的解释参考注释:# v5.0完成从配置文件中读取测试脚本,执行状态以及执行顺序import csvimport operatorimport unittestif __name__ == '__ma.
class T
est
Math(
unitt
est
.T
est
Case):
def t
est
_addition(self):
data = [(1, 2, 3), (4, 5, 9), (10, -5, 5)]
for a, b, expected in data:
result = a + b
self.assertEqual(result, expected)
if __name__ == '__main__':
unitt
est
.main()
在上面的代码中,我们定义了一个名为 T
est
Math 的测试类,并在其中定义了一个名为 t
est
_addition 的测试方法。该方法使用了数据驱动的方式,即使用一个包含多组数据的列表 data,每组数据包含两个加数和一个期望结果。然后,我们使用 for 循环遍历这个列表,对每组数据进行加法运算,并使用 assertEqual 方法断言运算结果是否等于期望结果。
最后,我们在代码的末尾使用
unitt
est
.main() 方法来运行测试。这个方法会自动发现并运行 T
est
Math 类中的所有测试方法,并输出测试结果。
希望这个代码示例能够帮助你理解如何使用
unitt
est
框架
实现
数据驱动的测试。