2017-11-22 10 views
0

私はunittestとseleniumを初めて使っていますが、これはPythonの最初の大きなコードです。 )私は、この問題のためにいくつかの答えを見つけましたが、__継承と方法スーパー(__ initでクラスには、について説明がありませんでした.__のinit __()Unittest + Selenium - __init __()は1つの位置引数をとりますが、2が与えられました

TL; DR 私は一つ一つを継承するクラスを持っています。クロムインスタンスを作成する最初のクラスのStartInstanceはunittest.TestCaseから継承し、問題は継承とsuper()にあります。他のクラスでのinit()、私はテストし、それを削除するとnormaly

すべてのように見える始まりbecouse:

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 :(

ALL:

FULLエラーメッセージ:

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.xyzによってアクセスdictsの辞書内の変数とのsettings.pyファイル[ "レイヤ1"] [ "KEY"]を持っている

setup.py - セットアップ次の層 - - 現在、非常に基本的なコンフィグ

class MainTestConfig(StartInstance): 
    def __init__(self): 
     super().__init__() 
     self.language = settings.TEST_LANGUAGE 
     self.currency = settings.TEST_CURRENCY 
セレン

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のためのクラス0

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を必要とbecouse前のクラスから継承します - 次の層、変数(HeadetText、HeaderPath、URLを(クラスのURL、ページのURL変数をクラス)である)(第一級StartInstanceから)、(MainTestConfigからの)言語、およびセレンドライバクラスの例ビルドを継承

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() 

(最終的に) をクリックしたときに変更いけないページ上のすべての「静的ビュー」をテストすることができ、書いたすべてのprevousのクラスを継承していますmain_cases.py - このエラーのランナーは、自分のinitでクラスを追加したときにのみ発生します...それを修復する方法はわかりません...私は__ __ initとスーパー()defはこの新しい.__の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()) 

を助けてください?

私は、このテストケースを起動すると、私はエラーを取得:

はTypeError:__のinit __()は1つの位置引数を取りますが、2は、上記完全なエラーメッセージ、おそらくそれは

ことができますが必要とされているが与えられました誰かが私を助けてくれますか?

答えて

1

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 
+0

私のコードでこれを使用しました、問題は私がちょうどソリューションを投稿した他の場所にありました;) とにかく; –

0

[OK]を、私はそれはあなたが書いたソリューションが良いです書いたよりも、何か他のものである...問題を発見しましたあまりにも私のコードでそれを使用しました。私の質問から

問題はここにあった:

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

私はに変更する必要があります。

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

なく、他の事は、私は開始時に適切に を動作するようにcompletlyそれを再構築しなければならなかったということです:継承__以前のクラスのスーパーからの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) 

をそれから私は、__ __ INITたunittest.TestCaseからの継承が不可能であることを理解しました。テストケースを開始する...何が起こったのか

私の新しい方法を想像するには、次の

something = Tests 

それは新しいエラー...私はテスト()を使用する必要が言わ作成していたのが、私が使用したときにこのフォームと私は前のエラーを持っていたので、両方の方法が悪かった。 だから私の変数で作成したクラス、ない__ __ initがないと何のスーパー(と)

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

私は将来的には多分誰かbecouseこれを書いているunittestので__ initの__使用しようとします...それうまくいかない...または私はちょうど解決策を見つけられませんでしたが、私は新しいです:P

関連する問題