无法在python中实例化unittest.Testcase的子类

时间:2011-02-14 02:57:22

标签: python unit-testing

我正在迭代一个文本文件。

文件文本文件中的每一行都是测试的名称。

我正在尝试实例化测试类,但我一直收到此错误:

ValueError: no such test method in <class 'login_to_blog'>: runTest

我正在做的代码在这里:

    test_name = line.replace("\n", "") #name of test file, class, and method _must_ be shared.
    module = __import__(test_name)
    test_class = getattr(module, test_name)
    suite.addTest(test_class())

这里是login_to_blog:

from selenium import selenium
import unittest, time, re

class login_to_blog(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*chrome", "http://blog/")
        self.selenium.start()

    def test_login_to_blog(self):
        sel = self.selenium
        sel.open("/")
        sel.type("signin_username", "jim")
        sel.type("signin_password", "jones")
        sel.click("//input[@value='Signin']")
        sel.wait_for_page_to_load("30000")
        try: self.failUnless(sel.is_text_present("your blog posts"))
        except AssertionError, e: self.verificationErrors.append(str(e))

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)

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

重要的是要注意这些测试由他们通过命令行成功运行。

任何想法如何实例化它们并从python代码中手动运行它们?

2 个答案:

答案 0 :(得分:8)

查看PyUnit Suite Documentation,它说:

  

创建实例时,我们必须指定要运行的测试方法。我们通过在构造函数中传递方法名称来完成此操作:

    defaultSizeTestCase = WidgetTestCase("testDefaultSize")
    resizeTestCase = WidgetTestCase("testResize")

再往下,我认为您正在寻找的是:

  

由于创建具有许多类似命名的测试函数的TestCase子类是一种常见模式,因此在unittest模块中提供了一个名为makeSuite的便捷函数,它构造了一个包含测试用例类中所有测试用例的测试套件。 : -

   suite = unittest.makeSuite(WidgetTestCase,'test')

所以你想要:

suite = unittest.makeSuite(test_class, 'test')
result = unittest.TestResult()
suite.run(result)

或类似的东西。

答案 1 :(得分:1)

许多人希望他们可以创建一个测试套件,他们可以添加一个基于unittest.TestCase的完整类,它将自动运行所有“test *” - 函数。那是因为unittest.main()会这样做。但实际上,每个TestCase类只调用一个方法 - 查看lib / python / unittest / case.py

中unittest.TestCase的源代码
class TestCase:
    def __init__(self, methodName='runTest'):

这就是错误的来源,因为基类TestCase不提供“def runTest”的默认实现。如果你想模仿unitest.main的行为,那么你需要创建一个你想要执行的测试类FOR EACH方法的一个实例

test_name = line.replace("\n", "") #name of test file, class, and method _must_ be shared.
module = __import__(test_name)
test_class = getattr(module, test_name)
for method in dir(test_class):
    if method.startswith("test"):
        suite.addTest(test_class(method))