Python 可复制测试框架
我正在寻找一个测试或集成框架,支持长时间、高成本的正确性测试。仅当影响测试的代码发生更改时,才应重新运行测试 理想情况下,测试框架将Python 可复制测试框架,python,testing,automated-tests,Python,Testing,Automated Tests,我正在寻找一个测试或集成框架,支持长时间、高成本的正确性测试。仅当影响测试的代码发生更改时,才应重新运行测试 理想情况下,测试框架将 找到测试的代码 把它弄得乱七八糟 运行代码并以哈希作为名称写入输出文件 如果已经存在,则跳过 简单概述哪些测试成功,哪些测试失败 如果测试必须指定它所依赖的模块和文件,那么就可以了 Python将是理想的,但这个问题可能非常严重,其他语言也可以解决 也许已经存在一个测试或构建集成框架,我可以调整它来适应这种行为?这可能不是最有效的方法,但可以通过Python的
- 找到测试的代码
- 把它弄得乱七八糟
- 运行代码并以哈希作为名称写入输出文件
- 如果已经存在,则跳过
- 简单概述哪些测试成功,哪些测试失败
也许已经存在一个测试或构建集成框架,我可以调整它来适应这种行为?这可能不是最有效的方法,但可以通过Python的
pickle
模块来实现
import pickle
在文件末尾,将其自身保存为pickle
myfile = open('myfile.py', 'r') #Your script
savefile = open('savefile.pkl', 'w') #File the script will be saved to
#Any file extension can be used but I like .pkl for "pickle"
mytext = myfile.readlines()
pickle.dump(mytext, savefile) #Saves list from readlines() as a pickle
myfile.close()
savefile.close()
然后在脚本的开头(在已经对其进行了一次pickle之后),添加代码位,以根据pickle检查脚本
myfile = ('myfile.py', 'r')
savefile = ('savefile.pkl', 'r')
mytext = myfile.readlines
savetext = pickle.load(savefile)
myfile.close()
savefile.close()
if mytext == savetext:
#Do whatever you want it to do
else:
#more code
这应该行得通。它有点长,但它是纯python,应该做您想要做的事情。基本上,您需要跟踪测试在做什么,以便检查它是否已更改 Python代码可以通过跟踪。有一个模块可以提供帮助 但如果它不仅仅是Python代码——如果测试执行其他程序、测试输入文件等,并且您也需要观察它的变化,那么您将需要在操作系统级别进行跟踪,比如
strace
,dtrace
,dtruss
我创建了一个简单测试框架的小型演示/原型,它只运行与上次运行不同的测试:它使用跟踪
模块。它是这样工作的:
- 如果指纹与指纹中列出的函数的当前字节码匹配,则跳过测试
- 否则运行测试
- 在运行时跟踪它,记录所有被调用的函数
- 使用每个记录函数的函数名和字节码MD5哈希创建测试指纹
trace跟踪时运行代码。trace
比不使用跟踪时慢约40倍。因此,也许您最好在没有跟踪的情况下运行所有测试:),但是如果跟踪程序是用C实现的,例如,它应该更快。(Pythontrace
模块不在C语言中。)
也许其他一些技巧可以提高速度。也许您只对一些顶级函数感兴趣,不管它们是否更改,所以您不需要跟踪所有函数调用
您是否考虑过其他方法来加速昂贵的测试?与并行化一样,ramdisk(tmpfs)。。。例如,如果针对数据库进行测试,不要使用“系统”或开发数据库,而是从tmpfs运行具有轻量级配置(无预分配、无日志…)的数据库的特殊实例。当然,如果可能的话,一些测试需要在类似于生产的配置上运行
一些测试框架(或它们的插件)只能运行上次失败的测试——这是不同的,但功能类似。你看过
nose
?做测试是很流行的。也许在主题上,也许另一个选项是从python文件的散列创建指纹(即不执行它)?在这种情况下,例如fib的md5散列。py@j13r是的,但您需要知道给定的测试使用给定的.py文件。这就是我使用跟踪的原因,但如果有其他方法,而不是跟踪,那么它会更好。当然,您可以至少对测试函数所在的文件进行哈希,但我认为您还希望对该测试执行的所有其他文件进行哈希。顺便说一句。我不必“执行”函数来获取它的散列,我只需要执行函数来了解它使用的其他函数。为了得到一个函数散列,我只需要导入该文件,它应该是轻量级的-它不应该执行任何“昂贵”的代码。我有一个想法-也许不需要跟踪函数执行来获得它执行的其他函数的列表;也许我可以通过检查函数字节码得到这个列表…:)