2015-02-26 54 views
0

我在鼻子测试框架有一个小问题。鼻子:找到测试生成器

场景:

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

现在,我已经在我的班级里使用了正常的测试方法。这意味着在我的测试方法中,我正在为要测试的设备加载配置文件,然后遍历该文件中的所有配置并执行测试。不幸的是,这只会给每个设备一个测试结果,而不是每个设备测试的配置。

所以我偶然发现了鼻子自己的测试发生器。旧的测试被修改了,所以他们使用了一个发生器,一切都很好,我得到了每个配置的结果,一切都很顺利。

我的小问题:

不过,我已经看到了现在就碰了壁。当使用--collect-only来显示可用的测试时,我得到两种可能的结果之一:

  1. 加载配置文件,测试生成器根据该配置文件生成测试。这意味着鼻子显示每种可能的参数配置的测试。但是,由于配置文件可能不适合我想稍后测试的设备,所以我得到错误结果。
  2. 我发现提供了--collect-only功能的插件可以绕过测试的灯具。因此,我将配置加载到夹具中,以避免生成的测试将可用测试列表垃圾邮件。不幸的是,这导致没有生成测试,因此测试不被显示为发电机没有产生什么

我试了一下,到目前为止:

所以,我已经尝试了几件事情解决此问题:

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

    ķ 从nose.loader进口TestLoader 从nose.util进口isgenerator 进口OS

    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问题,或者我只是盲目地看到明显的解决方案。

回答

0

好吧,所以,在跳过调试器之后,我想出了以下解决方案,并将其作为答案发布在此处,因为它似乎可行。然而,它看起来既不优雅,也不知道它究竟有多稳定。

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”属性,所以我检查它,然后遍历工厂内的所有套件,每次检查它是否是一个函数。如果是,我有测试生成器功能。

因此,如果有人提出更好的解决方案,我很乐意看到它。这种方式看起来有点怪异。