首页 > 解决方案 > AttributeError: 'list' 对象在尝试围绕 assertEquals 进行包装时没有属性 '_getAssertEqualityFunc'

问题描述

我正在尝试围绕 assertEquals 制作一个包装器方法(下面的代码)。当我运行测试时,我收到以下错误:“AttributeError:'list' object has no attribute '_getAssertEqualityFunc'”

我尝试过直接使用 assertEquals 并且它可以工作,但是当断言失败时我需要做更多的事情。

from unittest import TestCase as a


class Asserts:

    _assert_list = []

    @property
    def assert_list(self):
       return self._assert_list

    def equals(self, first, second, msg=None):
        """Fail if the two objects are unequal as determined by the '=='
           operator.
        """
        try:
            A.assertEquals(first, second, msg)

        except AssertionError:
            self._assert_list.append(AssertionError.__cause__)

编辑:稍微更改了代码。我想在执行多个测试时使用它,以便在运行过程中出现故障时不会在运行过程中停止。就像所有这些断言一样,如果测试失败,它不会停止测试,而是将原因附加到列表中,最后我将断言列表是否为空。

Traceback:
Traceback(最近一次调用最后一次):
文件“路径”,第 88 行,在 test_tc_01 self.a.equals(self.li, self.li2)
文件“路径”,第 21 行,等于 a.assertEquals(first,第二,味精)
文件“路径”,第 1321 行,在 deprecated_func 返回 original_func(*args, **kwargs)
文件“路径”,第 828 行,在 assertEqual assertion_func = self._getAssertEqualityFunc(first, second) AttributeError: 'list' object has没有属性“_getAssertEqualityFunc”

编辑 2:我在一个测试中有多个断言。例如,如果第一个失败,则跳过其余的。这就是为什么我想在我的框架中实现它

编辑 3:应要求,在这里进行测试

def setUp(self):
    self.driver = WebDriver(browser='chrome').browser
    self.driver.get(self.RLO_URL)
    self.driver.maximize_window()
    self.wait = WebDriverWait(self.driver, 10)
    self.driver.implicitly_wait(10)
    self.a = Asserts()

    login_page = LoginPage(self.driver)
    login_page.log_in()

def test_tc_01(self):
    self.maxDiff = None
    nav_page = NavBarPage(self.driver)
    nav_page.go_to_start_new_process()

    start_new_process_page = StartNewProcessPage(self.driver)
    start_new_process_page.start()

    process_page = ProcessPage(self.driver)
    app_info = process_page.application_info
    import pdb; pdb.set_trace()

    # self.assertEquals(app_info.get_country_list(), self.EXPECTED_COUNTRIES)
    self.assertEquals(app_info.get_channel_list(), self.EXPECTED_CHANNELS)
    self.assertEquals(app_info.get_marketing_source_list(), self.EXPECTED_MARKETING_SOURCE)
    self.assertEquals(app_info.get_marketing_agreement_list(), self.EXPECTED_MARKETING_AGREEMENT)
    self.assertEquals(app_info.get_office_credit_list(), self.EXPECTED_OFFICE_CREDIT)

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

标签: pythonseleniumassert

解决方案


我从 unittest 文档here中举了一个例子,并在中间添加了一个失败的测试(断言 false 是正确的,只是为了向您展示这一点)。

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_fail(self):
        self.assertTrue(False)

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

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

运行此程序时,您将获得以下输出:

======================================================================
FAIL: test_fail (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/refael.cohen/PycharmProjects/tools & trials/unittest_suite.py", line 13, in test_fail
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 4 tests in 0.001s

FAILED (failures=1)

请注意,即使套件失败了,所有测试都运行了。

此外,您可以使用@unittest.expectedFailure装饰器来预期测试失败,然后整个套件将通过


推荐阅读