【问题标题】:Nose: find test generator鼻子:找到测试生成器
【发布时间】:2015-02-26 10:53:51
【问题描述】:

鼻子测试框架有点问题。

场景:

我想使用已连接到计算机的设备测试我的软件。每个设备都使用不同的配置集进行测试。幸运的是,由于测试代码没有改变,我可以简单地创建包含每个设备配置的文件。

目前,我在课堂上使用了普通的测试方法。这意味着在我的测试方法中,我正在为要测试的设备加载配置文件,然后遍历该文件中的所有配置并执行测试。不幸的是,这只会为每个设备提供一个测试结果,而不是每个测试设备的配置一个。

所以我偶然发现了鼻子自己的测试生成器。旧的测试已经过修改,所以他们使用了生成器,到目前为止一切正常,我得到了每个配置的结果,一切都很好。

我的小问题:

但是,我现在看到碰壁了。使用 --collect-only 显示可用测试时,我得到以下两种可能结果之一:

  1. 加载配置文件,测试生成器根据该配置文件生成测试。这意味着鼻子会显示带有每个可能参数配置的测试。但是,由于配置文件可能不适合我稍后要测试的设备,所以我得到了错误的结果。
  2. 我发现提供 --collect-only 功能的插件绕过了测试的固定装置。所以我将配置的加载移动到一个夹具中,以避免生成的测试在可用测试列表中发送垃圾邮件。不幸的是,这导致没有生成测试,因此没有显示测试,因为生成器没有生成任何东西

到目前为止我尝试了什么:

所以,我尝试了一些方法来解决这个问题:

  1. 使用标志来确定 --collect-only 是否正在运行。由于 collect 插件绕过了固定装置,我在生成器中设置了一个默认值为 true 的标志,并在该生成器的固定装置中将其设置为 false。我希望在 --collect-only 运行时检查标志并简单地忽略测试生成可以解决我的问题。那是我了解到鼻子检查测试方法是否是生成器并期望它提供测试方法的时候。
  2. 由于我的第一个想法失败了,因为nose 知道该函数是一个生成器,并期望从中至少生成一个函数,我的第二个想法是使用一组空参数调用该函数。由于我的配置存储在 dict() 中,因此我只是传递了一个空 dict。幸运的是,这足以生成测试。但是,显然,nose 会检查测试是否可执行,如果失败,则再次忽略测试。
  3. 第二次失败后,我尝试了另一个方向。我读了一下nose的源代码,试图弄清楚它是如何在内部工作的。那是我偶然发现“isgenerator()”检查的时候。所以我想,我会自己扫描我的目录中的测试,将我找到的所有静态测试添加到列表中,当我偶然发现生成器时,我不会生成测试,而是将生成器的名称添加到列表中测试。好吧,这个失败了,因为我对鼻子内部的工作方式没有真正的经验。意思是,我找到了所有的静态测试,但没有找到生成器。目前,这是我查找测试的代码:

    k 从nose.loader 导入TestLoader 从鼻子.util导入isgenerator 导入操作系统

    folder = os.getcwd()
    testLoader = TestLoader()
    tests = testLoader.loadTestsFromDir(folder)
    for testModule in tests:
    print ("Found test module %s" % testModule.id())
    for testFile in testModule:
        print ("Found test file %s" % testFile.id())
        for test in testFile:
            print("Found test %s" % test.id())
            if not isgenerator(test):
                for x in test:
                    print("Found x %s" % x.id())
            else:
                print ("GENERATOR FOUND")
    

我想尽办法尝试什么。也许我遇到了某种 X-Y 问题,或者我只是盲目地看不到明显的解决方案。

【问题讨论】:

    标签: python python-3.x nose


    【解决方案1】:

    好的,所以,在稍微跳过调试器之后,我想出了以下解决方案,并将其发布在这里作为答案,因为它似乎有效。然而,它既不是很优雅的外观,我也不知道它到底有多稳定。

    foundTests = dict()
        for testPackage in loadedTests:
            #print ("Found test module %s" % testModule.id())
            for testModule in testPackage:
                #print ("Found test file %s" % testFile.id())
                for testCase in testModule:
                    #print("Found test %s" % test.id())
                        for test in testCase:
                            if isinstance(test, Test):
                                key, value = readTestInformation(test)
                                foundTests[key] = value
    
                            elif hasattr(test, "test_generator"):
                                factory = test.factory
                                for suite in factory.suites:
                                    try:
                                        if inspect.ismethod(suite):
                                            key, value = readGeneratedTestInformation(suite)
                                            foundTests[key]=value
                                    except:
                                        pass
    

    这个函数简单地遍历所有找到的包,在它们里面遍历所有找到的模块,在模块里面它遍历所有类,最后遍历一个类中的所有测试方法。

    如果一个测试方法是一个生成器,它似乎具有“test_generator”属性,所以我检查它,然后遍历工厂内的所有套件,每次检查它是否是一个函数。如果是,我得到了测试生成器功能。

    所以,如果有人提出更好的解决方案,我很乐意看到。这种方式似乎有点hacky。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-31
      • 2012-06-26
      • 2012-10-03
      • 1970-01-01
      • 2012-02-29
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多