关于python:Unittest + Selenium – __init __()需要1个位置参数,但是给出了2个

Unittest + Selenium - __init__() takes 1 positional argument but 2 were given

我第一次使用UnitTest和Selenium,但这也是我在Python中的第一个更大的代码。我找到了一些关于这个问题的答案,但是没有解释具有uuuuiit uuuu继承和方法super()的类。

DR我有一个接一个继承的类。创建chrome实例的第一个类startInstance继承自unittest.testcase,问题在于继承和其他类中的super().in it(),当我移除它时,它会正常启动。

一切看起来像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class StartInstance(unittest.TestCase):
    @classmethod
    def setUpClass(cls): pass

class A(StartInstance):
    def __init__(self):
        super().__init__() adding variables etc to init

class B(A):
    def __init__(self):
        super().__init__() adding variables etc to init

class C(A):
    def __init__(self):
        super().__init__() adding variables etc to init

class PrepareTests(B, C, D):
    def all tests(self):
        self.tests_B
        self.tests_C
        self.tests_D

 class Tests(PrepareTests):
    def test_click:
        click()
        all_tests()


 #and finally somewhere a test runner
 suite = loader.loadTestsFromTestCase(Tests)
 runner.run(suite())

#when i run this i get this error and it only raises when i
add classes with their own init
#heh TL;DR almost as long as normal text sorry :(

所有:

完整错误消息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Traceback (most recent call last):
 File"xyz\main_test.py", line 24,
 in <module>
   runner.run(suite())
  File"xyz\main_test.py", line 11,
in suite
   about_us = loader.loadTestsFromTestCase(AboutUs)
 File
"xyz\Python36\lib\unittest\loader.py", line 92, in loadTestsFromTestCase
loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames))
 File"xyz\Python36\lib\unittest\suite.py", line 24, in __init__
  self.addTests(tests)
 File"xyz\Python36\lib\unittest\suite.py", line 57, in addTests
   for test in tests:
 TypeError: __init__() takes 1 positional argument but 2 were given

这是我的密码:

我有一个settings.py文件,其中包含settings.xyz[第1层][键]访问的dict的dict变量

setup.py-Selenium的设置类

1
2
3
4
5
6
7
8
9
10
11
class StartInstance(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.get(settings.URLS['MAIN_URL'])
        cls.driver.implicitly_wait(2)
        cls.driver.maximize_window()

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

主测试-下一层-现在非常基本的配置

1
2
3
4
5
class MainTestConfig(StartInstance):
    def __init__(self):
        super().__init__()
        self.language = settings.TEST_LANGUAGE
        self.currency = settings.TEST_CURRENCY

header.py(像这样有几个文件)-下一层将config.py中的代码转换为类变量,继承以前的类,因为它需要全局语言

1
2
3
4
5
6
7
8
9
10
11
class HeaderPath(MainTestConfig):
    def __init__(self):
        super().__init__()
        self.logo_path = settings.PAGE_PATHS["HEADER"]["LOGO"]
        self.business_path = settings.PAGE_PATHS["HEADER"]["BUSINESS"]

class HeaderText(MainTestConfig):
    def __init__(self):
        super().__init__()
        self.business_text = settings.PAGE_CONTENT[self.language]["HEADER"]["BUSINESS"]
        self.cart_text = settings.PAGE_CONTENT[self.language]["HEADER"]["CART"]

header_tests.py-下一层,继承变量(headetext、headerpath、urls(class urls,它是带有page urls变量的类))、语言(来自maintestconfig)和Selenium驱动程序(来自first class startinstance),类的示例构建

1
2
3
4
5
6
7
8
9
10
class HeaderStaticTest(HeaderText, HeaderPath, Urls):
    def header_static(self):
        self.logo_display()
        self.method2()
        # etc..

    def logo_display(self):
        self.driver.find_element_by_xpath(self.logo_path)
    def self.method2(self):
        pass

static_display.py-下一层,类继承具有与前一层类似的测试的所有类,并使用其运行所有测试但不作为测试的方法_

1
2
3
4
5
class StaticDisplay(HeaderStaticTest, HorizontalStaticTest, VerticalStaticTest):
    def static_display(self):
        self.header_static()
        self.horizontal_static()
        self.vertical_static()

test-about-us.py-下一层,一个普通的UnitTest测试用例,它只继承了前一层,但一般来说它继承了我以前写的所有类,现在我可以测试页面上的所有"静态视图",当我单击按钮时这些视图不会改变。

1
2
3
4
5
6
7
8
9
10
11
class AboutUs(StaticDisplay):
    def test_horizontal_menu_click(self):
        about_us_element = self.driver.find_element_by_id(self.hor_about_path)
        about_us_element.click()
        self.assertIn(
            self.about_url,
            self.driver.current_url
        )

    def test_check_static_after_horizontal(self):
        self.static_display()

(最后)有这个错误的main_cases.py-runner,它只在我用自己的init添加类时出现…不知道如何修理它…请帮助

1
2
3
4
5
6
7
8
def suite():
    loader = unittest.TestLoader()
    about_us = loader.loadTestsFromTestCase(AboutUs)
    return unittest.TestSuite([about_us])

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())

正如我所说,在新类中,这个新的def init和super()有问题…我在哪里犯错误?

当我启动这个测试用例时,我得到一个错误:

类型错误:init接受1个位置参数,但上面给出了2个完整的错误消息,可能需要它

有人能帮我吗?


TestCase实例采用一个可选的关键字参数methodName;我猜想unittest模块在某些时候会在后台明确地传递这个参数。通常,当我对类进行子类化时,我不会使用这种模式;这可以解决您的问题:

1
2
3
class SubClass(SupClass):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

尤其是当您没有将任何参数传递给您的__init__方法时,以这种方式传递参数是避免出现错误的好方法。如果您想将自定义的东西传递给您的__init__方法,您可以这样做:

1
2
3
4
class SubClass(SupClass):
    def __init__(self, myarg, *args, **kwargs):
       super().__init__(*args, **kwargs)
       # do something with your custom argument


好吧,我发现了问题…它不是您编写的解决方案,您编写的解决方案也很好,我在代码中也使用了它。

我的问题是:

1
2
suite = loader.loadTestsFromTestCase(Tests)
runner.run(suite())

我应该改为:

1
2
3
something = Tests
suite = loader.loadTestsFromTestCase(something)
runner.run(suite())

但另一件事是我必须完全重建它才能正常工作一开始:继承上一个类的super是愚蠢的,因为我以前没有访问过这个类…所以我不能访问我的变量。所以我改变了:

1
2
3
class SubClass(SupClass):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

用:

1
2
3
class SubClass(SupClass):
    def __init__(self, *args, **kwargs):
        super(SubClass, self).setUpClass(*args, **kwargs)

然后我理解了UnitTest.testcase中的uuinit uuuuu继承是不可能的。想象发生了什么…

我启动测试用例的新方法:

1
something = Tests

它正在创建一个新错误…也就是说,我必须使用tests(),但是当我使用这个表单时,我得到了以前的错误,所以这两种方法都不好。所以我只是用变量创建了一个类,但是没有uuuinit uuu和super()。

1
2
3
4
class Something(StartInstance):
    a = thing1
    b = thing2
    c = thing3

我写这篇文章是因为将来可能会有人试图用UnitTest…它不起作用…或者我只是没有找到解决方案,但我是新的:P