我第一次使用unittest和selenium,但这也是我在python中的第一个更大的代码。我找到了这个问题的一些答案,但没有解释__ init __ inheritance和方法super()的类.__ init __()
TL; DR 我有一个接一个地继承的类。创建chrome实例的第一个类StartInstance继承自unittest.TestCase,问题在于继承和super()。 init ()在其他类中,因为当我删除它时测试normaly启动
所有看起来像:
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 :(
所有
完整错误消息:
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 [“layer1”] [“KEY”]
访问的dicts的dict中setup.py - selenium的设置类
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()
main_tests_config.py - 下一层 - 现在非常基本的配置
class MainTestConfig(StartInstance):
def __init__(self):
super().__init__()
self.language = settings.TEST_LANGUAGE
self.currency = settings.TEST_CURRENCY
header.py (还有更多这样的文件) - 下一层将代码从config.py转换为类变量,继承自之前的类,因为它需要全局语言
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 - 下一层,继承变量(HeadetText,HeaderPath,Urls(类Urls它是带有页面urls变量的类)),语言(来自MainTestConfig)和selenium驱动程序(来自第一层) class StartInstance),类
的示例构建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 - 下一层,继承所有类的类,类似于前一个类,并使用运行所有测试的方法但不是test _
class StaticDisplay(HeaderStaticTest, HorizontalStaticTest, VerticalStaticTest):
def static_display(self):
self.header_static()
self.horizontal_static()
self.vertical_static()
test_about_us.py - 下一层,一个普通的unittest测试用例,它只继承了前一个,但一般来说它继承了我写的所有流行类,现在我可以测试页面上的所有“静态视图”当我点击按钮时不会改变
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 - 有这个错误的跑步者,只有当我用自己的init添加类时才会引发...不知道如何修复它...请帮忙
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 __()在新类中出现问题...我犯了错误?
当我开始这个测试用例时,我收到一个错误:
TypeError:__ init __()需要1个位置参数,但有2个被赋予上面的完整错误消息,可能需要
有人能帮助我吗?
答案 0 :(得分:5)
TestCase
个实例采用可选的关键字参数methodName
;我猜测unittest
模块在某些时候明确地在幕后传递了它。通常,当我将类分类时,我没有自己做,我将使用这种模式;这应该可以解决你的问题:
class SubClass(SupClass):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
特别是当你没有向__init__
方法传递任何参数时,以这种方式传递参数是避免你得到的错误的好方法。如果您确实希望将自定义内容传递给__init__
方法,则可以执行以下操作:
class SubClass(SupClass):
def __init__(self, myarg, *args, **kwargs):
super().__init__(*args, **kwargs)
# do something with your custom argument
答案 1 :(得分:0)
好的,我发现了问题......除了你编写的解决方案之外你还写的很好,我也在我的代码中使用了它。
我的问题出现了问题:
suite = loader.loadTestsFromTestCase(Tests)
runner.run(suite())
我应该改为:
something = Tests
suite = loader.loadTestsFromTestCase(something)
runner.run(suite())
但另一件事是我必须完全重建才能正常工作 在开始时:继承__ init __来自上一课,超级是愚蠢的因为我之前没有访问过该类...所以我无法访问我的变量。所以我改变了:
class SubClass(SupClass):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
使用:
class SubClass(SupClass):
def __init__(self, *args, **kwargs):
super(SubClass, self).setUpClass(*args, **kwargs)
然后我明白了来自unittest.TestCase的__ init __继承是不可能的。想象发生了什么......
我开始测试用例的新方法:
something = Tests
它正在创建一个新的错误...说我必须使用测试()但是当我使用这个表单时,我得到了以前的错误,所以两种方式都很糟糕。 所以我只用变量创建了类,但是没有__ init __而没有super()
class Something(StartInstance):
a = thing1
b = thing2
c = thing3
我写这篇文章也许将来有人会尝试使用__ init __和unittest ...它没有工作......或者我只是没有找到解决方案,但是我是新人:P