可重复的测试框架

时间:2015-05-26 01:30:10

标签: python testing automated-tests

我正在寻找一个测试或集成框架,支持长期,昂贵的测试以确保正确性。只有在影响测试的代码发生变化时,才能重新运行测试。

理想情况下,测试框架

  • 找到测试代码
  • 生成它的哈希,
  • 运行代码并使用散列作为名称
  • 写入输出文件
  • 或如果已存在则跳过。
  • 简要概述了哪些测试成功,哪些测试失败。

如果测试必须指定它所依赖的模块和文件,那就没关系了。

Python是理想的,但这个问题可能很高,其他语言也可以使用。

也许已经存在一个我可以适应这种行为的测试或构建集成框架?

2 个答案:

答案 0 :(得分:1)

基本上,您需要跟踪测试的内容,以便检查它是否已更改。

可以使用sys.settrace(tracefunc)跟踪Python代码。有一个模块trace可以帮助它。

但如果它不只是Python代码 - 如果测试执行其他程序,测试输入文件等,你需要观察它的变化,那么你需要在操作系统级别上跟踪,如stracedtracedtruss

我创建了一个简单测试框架的小型演示/原型,它只运行上次运行时更改的测试:https://gist.github.com/messa/3825eba3ad3975840400它使用trace模块。它的工作原理如下:

  1. 收集测试,每个测试都按名称
  2. 标识
  3. 从JSON文件加载测试指纹(如果存在)
  4. 每次测试:
    • 如果指纹与指纹中列出的功能的当前字节码匹配,则跳过测试
    • 否则运行测试
      1. 在运行时跟踪它,记录所有被调用的函数
      2. 使用函数名称和每个记录函数的字节码MD5哈希值创建测试指纹
  5. 将更新的测试指纹保存到JSON文件
  6. 但有一个问题:。使用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,应该做你想要的。