簡體   English   中英

單元測試+硒-__init __()接受1個位置參數,但給出了2個

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

我第一次使用unittest和selenium,但這也是我在python中的第一個更大的代碼。 我為這個問題找到了一些答案,但是對於具有__ init __繼承和方法super()的類沒有解釋。__ init __()

TL; DR我有一個可以一一繼承的類。 創建chrome實例的第一個類StartInstance從unittest.TestCase繼承,問題出在繼承和super()上。 其他類中的init (),因為當我刪除它時,測試正常開始

一切看起來像:

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”]訪問的字典中的變量

setup.py-硒的安裝類

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它是具有頁面url變量的類)),語言(來自MainTestConfig)和selenium驅動程序(來自第一類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-下一層,一個普通的單元測試用例,它僅繼承上一個,但是一般而言,它繼承了我編寫的所有先前類,現在我可以測試頁面上的所有“靜態視圖”,當我單擊按鈕時它們都不會改變

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個完整的錯誤消息,可能是需要的

有人能幫助我嗎?

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

好的,我發現了問題...除了您編寫的解決方案也不錯以外,我還用了它。

我的問題出在這里:

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

我應該更改為:

something = Tests
suite = loader.loadTestsFromTestCase(something)
runner.run(suite())

但是另一件事是,我必須完全重建它才能正常工作開始時:從上一類的super繼承__ __ __________是愚蠢的,因為以前我沒有訪問該類的權限...所以我無法訪問我的變量。 所以我改變了:

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 __ __ __繼承是不可能的。 想像發生了什么...

我開始測試用例的新方法:

something = Tests 

它正在創建一個新的錯誤...說我必須使用Tests(),但是當我使用這種形式時,我又遇到了以前的錯誤,所以兩種方法都不好。 所以我剛剛創建了帶有變量的類,但是沒有__ init __並且沒有super()

class Something(StartInstance):
    a = thing1
    b = thing2
    c = thing3

我寫這封信是因為也許將來有人會嘗試將__ init __與unittest一起使用...這不起作用...或者我只是沒有找到解決方案,但我是新手:P

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM