Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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_Unit Testing_Nose_Unittest2 - Fatal编程技术网

Python 如何做一个;“提前返回”;在鼻子下面的进口?

Python 如何做一个;“提前返回”;在鼻子下面的进口?,python,unit-testing,nose,unittest2,Python,Unit Testing,Nose,Unittest2,我正在为一个大型Python项目策划大量的单元测试。我们用来做我们的测试发现和执行。我有一些测试文件,确实不应该在某些条件下运行。例如,我可能有一个永远不应该在Windows上运行的测试模块(只在Mac和Linux上运行) 以下是我使用过的一些解决方案: 使用Nose's卓越的测试方法或等级标记测试条件 用于测试方法或类 例如,用于跳过名称中带有windows的文件 我对1和2的抱怨是,这迫使我导入模块,这至少是浪费时间,如果存在依赖平台的导入,可能会导致错误。我不喜欢#3,因为我觉得它很脆弱,

我正在为一个大型Python项目策划大量的单元测试。我们用来做我们的测试发现和执行。我有一些测试文件,确实不应该在某些条件下运行。例如,我可能有一个永远不应该在Windows上运行的测试模块(只在Mac和Linux上运行)

以下是我使用过的一些解决方案:

  • 使用Nose's卓越的测试方法或等级标记测试条件
  • 用于测试方法或类
  • 例如,用于跳过名称中带有
    windows
    的文件
  • 我对1和2的抱怨是,这迫使我导入模块,这至少是浪费时间,如果存在依赖平台的导入,可能会导致错误。我不喜欢#3,因为我觉得它很脆弱,在阅读测试用例时不容易看出它将被跳过。这三种方法似乎都过分依赖于测试和测试运行者之间的交互,我想要测试中的东西

    我想在测试模块的顶部执行以下操作:

    """This module should not be run on Windows"""
    import platform
    if platform.system() == 'Windows':
        <stop reading this module.  nothing to see here>
    
    # do the tests.
    
    “此模块不应在Windows上运行”
    导入平台
    如果platform.system()=“Windows”:
    #做测试。
    

    我如何告诉Python或Nose停止读取模块,但没有错误?我想我正在寻找与提前返回等效的导入功能。

    从模块执行中提前返回的功能,但它收到了一些反对票,并且该功能未添加到语言中


    您可以阅读邮件列表线程,但一般认为,必须将模块的大部分缩进额外级别的问题不足以作为添加此“返回”功能的理由。有人说,模块中几乎所有的代码都应该在函数和类内部,几乎没有模块级代码会出现此问题。

    您可以在那里使用该消息引发导入错误。调用者可能会退出,并出现一个未捕获的异常,解释显示该错误,但如果需要,它可以捕获
    ImportError

    在Nose和unittest下,对SkipTest异常进行了特殊处理-它不是失败。因此,以下代码将停止执行,并且不会向unittest runner报告任何错误:

    import unittest
    import platform
    if platform.system() == 'Windows':
      raise unittest.case.SkipTest("The rest of this code will not be run on Windows.")
    

    你可以通过引发一个异常来做到这一点,但你必须在客户端代码中捕捉到这一点。如果你的主要问题是“导入是浪费时间”,那么我就不会太担心了。Python导入30-40个模块只是为了启动解释器(请参阅:Python-vv),运行导入100s或1000s的项目不会减慢速度。此外,即使在一个大型项目中,特定于平台的测试代码数量也应该非常少。我们谈论的是多少个模块?当然是1000个,但其中一些由于设计不佳而进口缓慢。然而,主要的问题是这些导入失败,在我们的测试日志中产生了误判。只是澄清一下——这不仅仅是平台特定的,有些是类似“opengl不可用”或“第三方工具未获得许可”的东西。是的,这是我在评论中提到的。客户端脚本是Nose,一个第三方工具。如果提出请求,它将注册失败。