2017-11-22 12 views
0

unittest와 selenium으로 처음으로 작업하지만 파이썬에서 처음으로 더 큰 코드이기도합니다. 나는이 문제에 대한 몇 가지 답을 찾았지만와 클래스에 대한 explaination가 없었다 __ 초기화 __ 상속 및 방법 슈퍼() .__ 초기화 __()Unittest + Selenium - __init __()은 1 개의 위치 인수를 취하지 만 2는

TL; DR 내가 하나 하나 상속 클래스가 있습니다. chrome 인스턴스를 생성하는 첫 번째 클래스 StartInstance는 unittest.TestCase에서 상속되며 문제는 상속 및 super()입니다. 나는 그것을 테스트 제거 할 때 normaly

을 시작 렸기 때문에 다른 클래스에서 초기화는(), 모든 보이는 같은 : ALL

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

:

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 
,210

내 코드 그게 전부 : 나는 settings.xyz 액세스 dicts의 DICT 변수와 settings.py 파일이

를 [ "레이어 1"] [ "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을위한 클래스 - 다음 층 - 지금 아주 기본적인 CONFIGS

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

header.py 0 (이 같은 몇 가지 더 많은 파일을 가지고) - 다음 층은 클래스 변수에 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, URL이 (클래스의 URL이 페이지 URL 변수와 클래스)이다) (제 1 급 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로하지 그들의 방법을 사용 유닛 테스트는 단지 이전 상속 테스트 케이스 그러나 일반적으로 내가

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 -이 오류가있는 러너이며, 자신의 초기화가있는 클래스를 추가 할 때만 발생합니다 ... 어떻게 복구해야하는지 모릅니다 ...내가 문제가이 새로운 데프 __ 초기화 __ 슈퍼 어딘가에이 말했듯이

def suite(): 
    loader = unittest.TestLoader() 
    about_us = loader.loadTestsFromTestCase(AboutUs) 
    return unittest.TestSuite([about_us]) 

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

도와주세요() .__ 초기화 __() 내가 실수를 만들고있어 새로운 클래스 ...에?

형식 오류 : 나는이 테스트 케이스를 시작하면

내가 오류가 발생 __ 초기화 __() 아마

를 할 필요,
전체 오류 메시지가 위의 주어진 한 위치 인수하지만이 소요 누군가 제발 도와 줘?

답변

1

TestCase 인스턴스는 선택적 키워드 인수 methodName을 사용합니다. 나는 unittest 모듈이 어떤 지점에서이 코드를 명시 적으로 전달한다고 추측합니다. 일반적으로 클래스를 서브 클래 싱 할 때 나는이 패턴을 사용할 것입니다. you이 your __init__ method to 어떤 arguments를 passing not 're when

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

이 Especially, this manner에 인수 through passing 수신 오류를 avoid하는 good 방법 : this은 your problem을 해결 should. 당신이 당신의 __init__ 방법에 뭔가 정의를 전달하려는 경우, 당신은 같은 것을 할 수있다 : 나는 문제를 발견,

class SubClass(SupClass): 
    def __init__(self, myarg, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     # do something with your custom argument 
+0

조언을 주셔서 감사합니다. 코드에 사용했습니다. 문제는 방금 솔루션을 게시 한 다른 곳에서였습니다.) 어쨌든 고마워;) –

0

확인을 ... 그것은 당신이 좋은 쓴 솔루션을 쓴 것보다 다른 것입니다 나는 또한 그것을 나의 코드에 사용했다. 내 질문에서

문제는 여기에 있었다 :

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

내가 변경해야합니다

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

하지만 또 다른 한가지는 내가 completly 시작에서 제대로 를 작동하도록 다시 작성해야한다고 수 있습니다 : 상속 __ 전에 클래스에 접근하지 않았기 때문에 super와 함께 이전 클래스의 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에서 상속이 불가능 이해했다. 테스트 케이스 시작 ... 무슨 일이 있었는지

내 새로운 방법을 상상하기 :

something = Tests 

는 새로운 오류 ... 내가 테스트()를 사용할 필요했다 생성되었다하지만 사용하는 경우 이 양식은 내가 가지고있어 이전 오류 그래서 양쪽 방법은 나빴어. 변수 그래서 내가 방금 만든 클래스,하지만 __ 초기화 __없이 슈퍼()

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

내가 ... 그것을 유닛 테스트와 __ __ 초기화 사용하려고합니다 미래에 어쩌면 누군가 렸기 때문에이 쓰고 있어요와 작동하지 않습니다 ...아니면 솔루션을 찾지 못했지만 새로운 것입니다 : P