我正在迭代一个文本文件。
文件文本文件中的每一行都是测试的名称。
我正在尝试实例化测试类,但我一直收到此错误:
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代码中手动运行它们?
答案 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))