Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 可复制测试框架_Python_Testing_Automated Tests - Fatal编程技术网

Python 可复制测试框架

Python 可复制测试框架,python,testing,automated-tests,Python,Testing,Automated Tests,我正在寻找一个测试或集成框架,支持长时间、高成本的正确性测试。仅当影响测试的代码发生更改时,才应重新运行测试 理想情况下,测试框架将 找到测试的代码 把它弄得乱七八糟 运行代码并以哈希作为名称写入输出文件 如果已经存在,则跳过 简单概述哪些测试成功,哪些测试失败 如果测试必须指定它所依赖的模块和文件,那么就可以了 Python将是理想的,但这个问题可能非常严重,其他语言也可以解决 也许已经存在一个测试或构建集成框架,我可以调整它来适应这种行为?这可能不是最有效的方法,但可以通过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

我创建了一个简单测试框架的小型演示/原型,它只运行与上次运行不同的测试:它使用
跟踪
模块。它是这样工作的:

  • 收集测试,每个测试由名称标识
  • 从JSON文件加载测试指纹(如果存在)
  • 对于每个测试:
    • 如果指纹与指纹中列出的函数的当前字节码匹配,则跳过测试
    • 否则运行测试
    • 在运行时跟踪它,记录所有被调用的函数
    • 使用每个记录函数的函数名和字节码MD5哈希创建测试指纹
  • 将更新的测试指纹保存到JSON文件
  • 但有一个问题:速度太慢了。使用
    trace跟踪时运行代码。trace
    比不使用跟踪时慢约40倍。因此,也许您最好在没有跟踪的情况下运行所有测试:),但是如果跟踪程序是用C实现的,例如,它应该更快。(Python
    trace
    模块不在C语言中。)

    也许其他一些技巧可以提高速度。也许您只对一些顶级函数感兴趣,不管它们是否更改,所以您不需要跟踪所有函数调用

    您是否考虑过其他方法来加速昂贵的测试?与并行化一样,ramdisk(tmpfs)。。。例如,如果针对数据库进行测试,不要使用“系统”或开发数据库,而是从tmpfs运行具有轻量级配置(无预分配、无日志…)的数据库的特殊实例。当然,如果可能的话,一些测试需要在类似于生产的配置上运行


    一些测试框架(或它们的插件)只能运行上次失败的测试——这是不同的,但功能类似。

    你看过
    nose
    ?做测试是很流行的。也许在主题上,也许另一个选项是从python文件的散列创建指纹(即不执行它)?在这种情况下,例如fib的md5散列。py@j13r是的,但您需要知道给定的测试使用给定的.py文件。这就是我使用跟踪的原因,但如果有其他方法,而不是跟踪,那么它会更好。当然,您可以至少对测试函数所在的文件进行哈希,但我认为您还希望对该测试执行的所有其他文件进行哈希。顺便说一句。我不必“执行”函数来获取它的散列,我只需要执行函数来了解它使用的其他函数。为了得到一个函数散列,我只需要导入该文件,它应该是轻量级的-它不应该执行任何“昂贵”的代码。我有一个想法-也许不需要跟踪函数执行来获得它执行的其他函数的列表;也许我可以通过检查函数字节码得到这个列表…:)