当前位置: 首页 > 面试题库 >

鼻子,unittest.TestCase和元类:未发现自动生成的test_ *方法

贺奕
2023-03-14
问题内容

这是单元测试和元类的后续问题:自动生成test_
*方法:

对于此(固定)unittest.TestCase布局:

#!/usr/bin/env python

import unittest


class TestMaker(type):

    def __new__(cls, name, bases, attrs):
        callables = dict([
            (meth_name, meth) for (meth_name, meth) in attrs.items() if
            meth_name.startswith('_test')
        ])

        for meth_name, meth in callables.items():
            assert callable(meth)
            _, _, testname = meth_name.partition('_test')

            # inject methods: test{testname}_v4,6(self)
            for suffix, arg in (('_false', False), ('_true', True)):
                testable_name = 'test{0}{1}'.format(testname, suffix)
                testable = lambda self, func=meth, arg=arg: func(self, arg)
                attrs[testable_name] = testable

        return type.__new__(cls, name, bases, attrs)


class TestCase(unittest.TestCase):

    __metaclass__ = TestMaker

    def test_normal(self):
        print 'Hello from ' + self.id()

    def _test_this(self, arg):
        print '[{0}] this: {1}'.format(self.id(), str(arg))

    def _test_that(self, arg):
        print '[{0}] that: {1}'.format(self.id(), str(arg))


if __name__ == '__main__':
    unittest.main()

这可使用stdlib框架进行。预期和实际产量:

C:\Users\santa4nt\Desktop>C:\Python27\python.exe test_meta.py
Hello from __main__.TestCase.test_normal
.[__main__.TestCase.test_that_false] that: False
.[__main__.TestCase.test_that_true] that: True
.[__main__.TestCase.test_this_false] this: False
.[__main__.TestCase.test_this_true] this: True
.
----------------------------------------------------------------------
Ran 5 tests in 0.015s

OK

但是,由于我实际上是在使用鼻子,因此这种技巧似乎并不相同。我得到的输出是:

C:\Users\santa4nt\Desktop>C:\Python27\python.exe C:\Python27\Scripts\nosetests test_meta.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

简而言之,test_*由元类生成的方法不会向鼻子注册。谁能阐明这一点?

谢谢,


问题答案:

因此,在仔细检查了stdlibunittest和鼻子的加载器和选择器源代码之后,事实证明鼻子重写unittest.TestLoader.getTestCaseNames将使用其自己的选择器(带有插件点)。

现在,鼻子的选择器将寻找一种可能的方法method.__name__来匹配某些正则表达式,黑白列表以及插件的决策。

在我的情况下,动态生成的函数具有testable.__name__ == '<lambda>',不匹配鼻子的选择器条件。

修理,

        # inject methods: test{testname}_v4,6(self)
        for suffix, arg in (('_false', False), ('_true', True)):
            testable_name = 'test{0}{1}'.format(testname, suffix)
            testable = lambda self, arg=arg: meth(self, arg)
            testable.__name__ = testable_name    # XXX: the fix
            attrs[testable_name] = testable

当然可以:

(sandbox-2.7)bash-3.2$ nosetests -vv 
test_normal (test_testgen.TestCase) ... ok
test_that_false (test_testgen.TestCase) ... ok
test_that_true (test_testgen.TestCase) ... ok
test_this_false (test_testgen.TestCase) ... ok
test_this_true (test_testgen.TestCase) ... ok

----------------------------------------------------------------------
Ran 5 tests in 0.005s

OK


 类似资料:
  • 问题内容: 实现类时,我的问题非常简单。(因为Eclipse和IDEA可以为我们生成)。 但是,当您扩展课程时,我不知道该怎么做。(当然,这项工作不是必须的,但是我想确定在代码中要做什么,因此此选项将很有帮助)。 谢谢 :) 问题答案: 对于Eclipse,进入Source菜单()-> Override / Implement Methods …,这将为您提供所有可以@overriden的方法的列

  • 我在Postgres数据库中创建了一个新表 但我得到的错误是: 我已将library.xml文件放在资源文件夹中。我是jooq的新手,Spring启动。请帮助我如何自动生成jooq类。

  • 我试图为我的MySql数据库自动生成jOOQ java代码,但它不起作用。我在maven的JSP项目中使用jOOQ。 xml 我正在使用Tomcat在eclipse上运行这个项目。当我想运行Web应用程序时,我会清理项目,然后清理项目 当我运行该项目时,并没有生成数据库的java代码<正如文档中所说,由于我在jOOQ中使用maven,因此我可以自动生成JAVA代码,而无需使用cli。无需创建库。x

  • 问题内容: 有什么工具可以自动生成 Java 代码的单元测试? 更新: 主要用途是为将要重构的遗留代码快速生成单元测试。自动生成后,无需自动使测试与代码保持同步。 在这里提出了几乎相同的问题,但是答案是.NET而不是Java(Pex是公认的答案): 问题答案: CodePro Analytix有一个JUnit测试生成模块,听起来像它可以完成您想要的。请参阅《用户指南》。 [CoView]是价格合理

  • 安装配置KnpSnappyBundle扩展 先安装扩展,执行: composer require knplabs/knp-snappy-bundle 再安装wkhtmltopdf工具 wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz xz -d wkh

  • 带注释的类中的followig代码可用于两个数据库的自动键生成,但如果主键是自设置的,则会失败。 如果没有@GeneratedValue和@SequenceGenerator注释,则可以手动设置主键,但自动生成无法工作。