在PyDev中初始化单元测试?

2024-05-26 21:51:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在eclipse中使用PyDev单元测试对python代码进行单元测试。我右键单击相应的文件,然后选择Run As->;Python unit test。关于这个插件,我有几个问题:

  1. 有没有办法在这个类中的任何其他测试之前执行一个setUpClass方法?目前我只能在类的任何测试之前调用设置
  2. 有没有办法在执行任何测试之前调用全局初始化?类似于setUpModule,我也无法使用PyDev单元测试运行它。

提前感谢您的回答和评论^^
切里奥沃尔坦

示例:

class TestClass(unittest.TestCase):

  @classmethod
  def setUpClass(self):
      print "Setup"    

  def test1(self):
      print "Test1"
  def test2(self):
      print "Test2"

如果我使用run As->;Python unit test运行此函数,则不会调用setUpClass方法。


Tags: 方法代码testgtselfdefasunit
3条回答

编辑:摘要

使用调试器逐步检查您的测试用例,看起来这是PyDev的测试运行程序不支持setUpClass()的一个限制,至少不支持我正在使用的1.6.5。

也许这会在PyDev的v2.0中得到修复,但同时,我认为我们将不得不stick使用__init__(),正如CarlS所建议的那样。

详细信息

PyDev 1.6.5 PyDevTestSuite类使用:

def run(self, result):
    for index, test in enumerate(self._tests):
        if result.shouldStop:
            break
        test(result)

        # Let the memory be released! 
        self._tests[index] = None

    return result

这与Python2.6中的TestSuite.run()非常相似,而Python2.7.1的unittest中的TestSuite.run()做的更多:

def run(self, result, debug=False):
    topLevel = False
    if getattr(result, '_testRunEntered', False) is False:
        result._testRunEntered = topLevel = True

    for test in self:
        if result.shouldStop:
            break

        if _isnotsuite(test):
            self._tearDownPreviousClass(test, result)
            self._handleModuleFixture(test, result)
            self._handleClassSetUp(test, result)
            result._previousTestClass = test.__class__

            if (getattr(test.__class__, '_classSetupFailed', False) or
                getattr(result, '_moduleSetUpFailed', False)):
                continue

        if not debug:
            test(result)
        else:
            test.debug()

    if topLevel:
        self._tearDownPreviousClass(None, result)
        self._handleModuleTearDown(result)
    return result

旧答案

我怀疑这可能是被引用的Python版本造成的。

如果您检查Window>;Preferences>;PyDev>;解释器-Python并查看正在使用的Python解释器,您可能会发现它是v2.7之前的版本,如果我没记错的话,这里引入了setUpClass。

引用较新版本的python,我怀疑您的测试将按原样工作。

这是一个PyDev错误,已在2.0.1中修复。

由于PyDev 2.0.0和更早版本中的错误,setUpModule()tearDownModule()setUpClass()tearDownClass()未在“Python单元测试”运行配置中运行。在2.0.1中,它们在“Python单元测试”和“Python运行”配置中正确运行。我自己测试了一下。

好吧,我来试一试:我使用Pydev,并且一直在探索使用“nosetests”来启动测试,所以它有点相关。我的解决方案是彻底的破解,但是当从PyDev内部说“Debug as UnitTest”时似乎确实有效:

print "before any tests (global) just once..."
class MyTestCase(unittest.TestCase):
   class_setup_called = False
   def __init__(self, test_name):
      unittest.TestCase.__init__(self, test_name)
      if not self.__class__.class_setup_called:
          self.setUpClass()
          self.__class__.class_setup_called = True
   @staticmethod
   def setUpClass():
      print "before first test only..."
   def setUp(self):
      print "before each test..."

不幸的是,这在使用nosetest时不起作用,但在从pydev运行时确实起作用。我猜nosetests是在运行每个测试方法之前被编码来实例化测试对象的,在这种情况下,init方法就足够了。

我说不出鼻子测试的好话:

  • 支持异常和定时 测验。
  • 支持注释“属性”。
  • 集成概要文件、覆盖范围和结果的xunit报告。
  • 测试用例的递归发现和属性执行。

示例:

import unittest
@raises(TypeError)          
def test_forexceptions(self): 
    pass

@attr('benchmark')
@timed(5.0)
def test_benchmark(self):
    pass # do something real slow and run nosetests --with-profile -a benchmark

附加

在进一步的调查中,如果你正在使用nose tests,那么它已经覆盖了你,请参见“http://somethingaboutorange.com/mrl/projects/nose/1.0.0/writing_tests.html”。

你可以有:

包级拆分:(这些位于包级init脚本中)

def setup_package()
def teardown_package()

模块级拆卸:

def setup_module()
def teardown_module()

班级级别:

class MyTestCase(unittest.TestCase):
    @classmethod
    def setup_class(cls): pass
    @classmethod
    def teardown_class(cls): pass

试验方法水平:

class MyTestCase(unittest.TestCase):
    def setUp(self): pass
    def tearDown(cls): pass

我喜欢使用“setup”名称,因为它很好地描绘了特定于鼻子的入口点。当通过命令行从nosetests运行时,我已经很好地验证了这些功能。但它们不是从Pydev“作为单元测试运行…”运行的。一个潜在的解决方案可能是编写一个pydev插件,该插件使用nose运行测试。。。也许有人有?你可以把我的黑客技术和nose技术结合起来,调用公共模块函数来完成实际的工作。理想情况下,我们的init(初始化)会意识到以某种方式从Pydev启动。

相关问题 更多 >

    热门问题