AttributeError:'TextTestResult'对象没有'assertIn'属性

4 投票
1 回答
4859 浏览
提问于 2025-04-18 06:16

我在用Python和selenium做一些测试,我在simpleUsageUnittest.py里定义了一些简单的测试:

import unittest
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class PythonOrgSearch(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()

#   @unittest.skip("skip test_001")
    def test_001_search_in_python_org(self):
        driver = self.driver
        driver.get("http://www.python.org")
        self.assertIn("Python", driver.title)
        elem = driver.find_element_by_name("q")
        elem.send_keys("selenium")
        elem.send_keys(Keys.RETURN)

#   @unittest.skip("skip test_002")
    def test_002_goole_and_stack_test_test(self):
        driver_g = self.driver
        driver_g.get("http://www.google.com")
        self.assertIn("Google", driver_g.title)
        body_g = driver_g.find_element_by_tag_name("body")
        body_g.send_keys(Keys.CONTROL + 't')
        driver_g.get("http://stackoverflow.com")
        self.assertIn("Stack", driver_g.title)

    def tearDown(self):
        self.driver.close()

if __name__ == "__main__":
    unittest.main(warnings = 'ignore')

单独运行这个测试集是没问题的,但我想创建一个测试套件,叫做testTestSuite.py:

import unittest
import simpleUsageUnittest
import sys

def suite():
    testSuite = unittest.TestSuite()
    testSuite.addTest(simpleUsageUnittest.PythonOrgSearch.setUp)
    testSuite.addTest(simpleUsageUnittest.PythonOrgSearch.test_001_search_in_python_org)
    testSuite.addTest(simpleUsageUnittest.PythonOrgSearch.test_002_goole_and_stack_test_test)
    testSuite.addTest(simpleUsageUnittest.PythonOrgSearch.tearDown)
    return testSuite

if __name__ == "__main__":
    result = unittest.TextTestRunner(verbosity=2).run(suite())
    sys.exit(not result.wasSuccessful())

但是在运行这个测试套件的时候,我遇到了一个错误,叫做AttributeError: 'TextTestResult'对象没有'assertIn'这个属性。因为我不太明白这个错误,所以我不知道怎么解决;) 如果我把simpleUsageUnittest.py里的assertIn那几行删掉,测试又能正常运行,但这显然不是我想要的!另外,关于Python 2.7的asserts示例对我帮助不大,因为我用的是Python 3.3.5和Selenium 2.41.0。有人能给我解释一下吗?或者告诉我可以用什么属性来保存我的assert?;)

完整的错误信息:

C:\Users\zzz\Python\selenium_tutorial>python testTestSuite.py
Traceback (most recent call last):
  File "testTestSuite.py", line 14, in <module>
    result = unittest.TextTestRunner(verbosity=2).run(suite())
  File "C:\Python33\lib\unittest\runner.py", line 168, in run
    test(result)
  File "C:\Python33\lib\unittest\suite.py", line 67, in __call__
    return self.run(*args, **kwds)
  File "C:\Python33\lib\unittest\suite.py", line 105, in run
    test(result)
  File "C:\Users\zzz\Python\selenium_tutorial\simpleUsageUnittest.py", line
 18, in test_001_search_in_python_org
    self.assertIn("Python", driver.title)
AttributeError: 'TextTestResult' object has no attribute 'assertIn'

解决方案

好的,看起来在我的testTestSuite.py里执行的时候,TextTestRunner把simpleUsageUnittest.py里的"self.assertIn"当成了self == TextTestRunner,而不是self == TestCase(我不知道我解释得对不对,但我就是这么理解的;))。这是修正后的testTestSuite.py:

import unittest
import simpleUsageUnittest
import sys

def suite():
    testSuite = unittest.TestSuite()
    testSuite.addTest(simpleUsageUnittest.PythonOrgSearch('test_001_search_in_python_org'))
    testSuite.addTest(simpleUsageUnittest.PythonOrgSearch('test_002_goole_and_stack_test_test'))
    return testSuite

if __name__ == "__main__":
    result = unittest.TextTestRunner(verbosity=2).run(suite())
    sys.exit(not result.wasSuccessful())

'setUp'和'tearDown'是自动调用的,所以在每个'test'之后不需要手动写。

1 个回答

2

解决方案

好的,看起来在我的 testTestSuite.py 文件中,当执行时,TextTestRunner 把 simpleUsageUnittest.py 里的 "self.asserIn" 行当成了 self == TextTestRunner,而不是 self == TestCase(我不知道我解释得对不对,但我就是这么理解的 ;))。这里是修正后的 testTestSuite.py:

import unittest
import simpleUsageUnittest
import sys

def suite():
    testSuite = unittest.TestSuite()
    testSuite.addTest(simpleUsageUnittest.PythonOrgSearch('test_001_search_in_python_org'))
    testSuite.addTest(simpleUsageUnittest.PythonOrgSearch('test_002_goole_and_stack_test_test'))
    return testSuite

if __name__ == "__main__":
    result = unittest.TextTestRunner(verbosity=2).run(suite())
    sys.exit(not result.wasSuccessful())

'setUp' 和 'tearDown' 没有出现,因为它们会在每个 'test' 之后自动调用。

撰写回答