python数据驱动测试——根据两个字符串找到某个类或变量
Posted 上海一亩地
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python数据驱动测试——根据两个字符串找到某个类或变量相关的知识,希望对你有一定的参考价值。
数据启动测试构想
在数据库中建立一张表,这张表有4列:
自动化测试用例所在的python文件(字符串),测试用例函数名(字符串),测试数据(字典),是否运行这个用例yes/no。
然后写一个主程序,从数据库抓取数据,然后一行一行的读,读一行就执行一个case。
问题来了:
数据库中文件和函数名都是字符串,如何通过字符串执行case并传参?
解决办法:
使用python标准库中的importlib能通过字符串定位到模块,然后通过getattr()内置函数能通过字符串定位模块中的函数、变量、类等python对象。通过eval()内置函数能讲字符串直接转化成一行python代码!
案例一:
假如项目是test_suite,
有一个测试用例叫web_login,是一个函数,写在test_suite/case/web_test.py中,如何运行这个函数?
如果是原始方法应该是这样:
from case.web_test import web_login
web_login("https://www.baidu.com")
但是如果你有10000个测试用例要执行,你是不是运行10000个函数,写10000行?
from case.web_test import *
web_login("https://www.baidu.com")
search("一天208万")
get_news(5)
......
......
......
我想吐槽这种写法:
第一:import * 不符合pep8编码规范,容易被静态代码扫描工具检测出来。
第二:运行一个新用例就要写一行,代码越来越长,
第三:如果不运行一些case,需要注释或者删除。
第四:测试数据是写在代码里的,修改繁琐,也不安全。我们需要数据和代码解耦。
理想的数据驱动测试结构
建个数据库,建一张表,表有四列:
python文件路径(str)、函数名(str)、函数传值(dict)、是否运行(str)。
关键技术:
importlib.import_module: 标准库的importlib能通过字符串import 模块,返回模块对象。
getattr() : 内置函数,通过字符串找到并返回对应python对象,类、函数、变量等都行。
eval() : 直接将字符串转化成代码。
第一步:通过pandas从数据库获取数据存到本地Excel或者csv文件
import pandas as pd
import pymysql
from sqlalchemy import create_engine
sql = 'select * from data'
conn = create_engine('mysql+pymysql://root:159951@127.0.0.1:3306/test')
dataframe = pd.read_sql(sql,conn)
dateframe.write_to_cvs("./data.csv")
第二步:逐行读取数据,运行用例。
import importlib
import importlib.util
with open("./data.csv","r+") as file:
lines = file.readlines()
for line in lines:
records = line.split(",")
# 假设读到一行数据:
# “case.web_test” ,"web_login" , {values: "https://www.baidu.com"} , "yes"
script,func,values,execute = records[0],records[1],records[2],records[3]
# 如果数据库第四列执行是no,则不执行这个用例
if not execute:
continue
# import 文件
module = importlib.import_module(script)
# 查找函数体
function = getattr(module,func,None)
if not function:
print("function not found!")
continue
# 运行用例并返回
return function(values)
eval尝试
a = 'hahahahahahahahahaha'
todo = 'print(a)'
eval(todo)
以上是关于python数据驱动测试——根据两个字符串找到某个类或变量的主要内容,如果未能解决你的问题,请参考以下文章