我正在寻找一个测试或集成框架,支持长期,昂贵的测试以确保正确性。只有在影响测试的代码发生变化时,才能重新运行测试。
理想情况下,测试框架
如果测试必须指定它所依赖的模块和文件,那就没关系了。
Python是理想的,但这个问题可能很高,其他语言也可以使用。
也许已经存在一个我可以适应这种行为的测试或构建集成框架?
答案 0 :(得分:1)
基本上,您需要跟踪测试的内容,以便检查它是否已更改。
可以使用sys.settrace(tracefunc)
跟踪Python代码。有一个模块trace
可以帮助它。
但如果它不只是Python代码 - 如果测试执行其他程序,测试输入文件等,你需要观察它的变化,那么你需要在操作系统级别上跟踪,如strace
,dtrace
,dtruss
。
我创建了一个简单测试框架的小型演示/原型,它只运行上次运行时更改的测试:https://gist.github.com/messa/3825eba3ad3975840400它使用trace
模块。它的工作原理如下:
但有一个问题:慢。使用trace.Trace
跟踪代码时运行代码比没有跟踪时慢大约40倍。所以也许你会更好地运行所有测试而不用跟踪:)但是如果跟踪器将在C中实现,例如it is in the coverage
module它应该更快。 (Python trace
模块不在C中。)
也许其他一些技巧可以帮助提高速度。也许您只对某些顶级函数感兴趣,无论它们是否发生了变化,因此您不需要跟踪所有函数调用。
您是否考虑过其他方法如何加快昂贵的测试?就像paralellization一样,ramdisk(tmpfs)...例如,如果你对数据库进行测试,就不要使用"系统"或者开发一个,但是从tmpfs使用轻量级配置(没有prealloc,没有journal ...)运行数据库的特殊实例。如果可能,当然 - 某些测试需要在类似于生产的配置上运行。
某些测试框架(或其插件)只能运行上次失败的测试 - 这是不同的,但有点类似的功能。
答案 1 :(得分:0)
这可能不是最有效的方法,但这可以通过Python的pickle
模块来完成。
import 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。
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,应该做你想要的。