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个完整的错误消息,可能需要它
有人能帮我吗?
1 2 3 | class SubClass(SupClass): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) |
尤其是当您没有将任何参数传递给您的
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