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数据驱动测试——根据两个字符串找到某个类或变量的主要内容,如果未能解决你的问题,请参考以下文章

Python Selenium 之数据驱动测试

Python学习系列之反射

Python Selenium 之数据驱动测试的实现

Python Selenium 之数据驱动测试的实现

python webdriver 测试框架-数据驱动excel驱动的方式

Python 数据驱动ddt 使用