Appium - unittest + html-testRunner 로 테스트 실행하고 리포트받기

정태경·2022년 1월 16일
1
post-thumbnail
post-custom-banner

unittest 로 테스트 케이스를 실행하려면 setUP, tearDown 메서드가 필수적이다. 그러나 모든 테스트 케이스에 setUP, tearDown 메서드를 포함하게되면 유지보수 및 코드 가독성이 저하된다. 따라서 다음과 같이 모듈을 분리하였다.

WebDriverSetup.py : 모든 테스트 케이스에 공통적으로 사용하는 setUP, tearDown 메서드 정의한다. 그리고 각 테스트 케이스는 WebDriverSetup 를 상속받아 테스트 케이스만 구현한다

WebDriverSetup.py
import unittest
import os

from appium import webdriver


class WebDriverSetup(unittest.TestCase):

    def setUp(self):
        app = os.path.join(os.path.dirname(__file__), '/Users/taekyeong.jung/Desktop/workspace/','myrealtrip.apk')
        app = os.path.abspath(app)
        self.driver = webdriver.Remote(
            command_executor='http://127.0.0.1:4723/wd/hub',
            desired_capabilities={
                'app': app,
                'platformName': 'Android',
                'udid': 'emulator-5554',
                'platformVersion': '11.0',
                'automationName': 'uiautomator2',
                'appPackage': 'com.mrt.ducati.dev',
                'appActivity': 'com.mrt.ducati.LauncherActivity',
                'chromeOptions': {'w3c': False}
            })

    def tearDown(self):
        self.driver.quit()


if __name__ == '__main__':
    unittest.main()
BASIC_login.py
from TestBase.WebDriverSetup import WebDriverSetup
from Pages.page_splash import SplashPage


class LoginTest(WebDriverSetup):

    def test_case_1(self):

        splash = SplashPage(self.driver)
        splash.click(SplashPage.btn_positive)

그리고 이어진 고민.. 자동화 테스트 결과 보고서를 받아볼 수 없을까?

내가 생각한 가장 기본적인 구조는 다음과 같다

  1. 테스트 시나리오에 따른 케이스 케이스를 작성한다
  2. 작성된 테스트 케이스를 불러온다
  3. 테스트 케이스들을 묶어 테스트 스위트를 구성한다
  4. 테스트 러너를 통해 테스트 스위트를 실행한다
  5. 테스트 결과 리포트를 받는다.

다이어그램으로 그려보면 이렇게..

오 근데 역시 내가 찾던 라이브러리가 있다!

구글링을 해보니 내가 원하는 자동화 구조 설계를 완벽히 지원하는 라이브러리가 있어 인스톨하였다. unittesthtml-testRunnert 를 함께 사용하면 위 다이어 그램의 모든 스텝을 한번에 해결할 수 있다

pip3 install html-testRunner==1.2.1
import unittest

import HtmlTestRunner

from Tests.TEST_BASIC.BASIC_login import LoginTest

""" 테스트 로더로 테스트 케이스 불러오기 """
testcase = unittest.TestLoader().loadTestsFromTestCase(LoginTest)

""" 테스트 스위트 구성 """
testsuite = unittest.TestSuite([testcase])

""" 테스트 러너로 테스트 실행 """
HtmlTestRunner.HTMLTestRunner(
                              output="Reports",              # 보고서 생성할 폴더 이름
                              report_name="Report",          # HTML 파일 이름
                              report_title="Test Results",   # HTML 파일 타이틀
                              combine_reports=True           # True : 테스트 케이스가 여러개 일 때 보고서 하나로 합치기
                              ).run(testsuite)

그래서 최종적으로 정리하자면 프로젝트 트리는 이렇게 구성된다

├── Config                               # 공통으로 사용하는 정보 정의 (계정 등) 
│   ├── __init__.py
│   └── config.py                        
├── Drivers                              # 필요한 드라이버들 넣어주자
│   └── chromedriver
├── Pages                            
│   ├── __init__.py
│   ├── page_Base.py                     # 모든 페이지에서 공통으로 사용할 메서드 정의
│   └── page_splash.py                   # 스플래시 화면의 locator 와 이 화면에서만 사용할 메서드 정의 
│   └── page_mainhome.py                 # 메인홈 화면의 locator 와 이 화면에서만 사용할 메서드 정의   
├── Reports
│   └── Report_2022-01-16_10-24-14.html  # html-testRunner로 생성된 리포트 저장
├── TestBase                             
│   ├── WebDriverSetup.py                # 테스트 케이스에서 공통으로 사용하는 setUp(), tearDown() 메서드 정의
│   ├── __init__.py
├── Tests
│   ├── TEST_BASIC
│   │   ├── BASIC_login.py               # 로그인 테스트 케이스      
│   │   ├── __init__.py
│   ├── TEST_SCENARIO
│   │   ├── SCENARIO_login.py            # 로그인 테스트 시나리오
│   │   └── __init__.py
│   ├── __init__.py
├── __init__.py
├── requiremenys.txt
└── runner.py                            # 테스트 러너로 테스트 실행

테스트 결과 보고서는 이렇게 나온다

profile
두나무 업비트 QA 엔지니어
post-custom-banner

3개의 댓글

comment-user-thumbnail
2024년 2월 23일

안녕하세요. app 자동화 테스트 구현에 큰 도움 받고있습니다.
한 개 클래스 내에 2개 메소드를 만들고 테스트러너를 돌리니 첫번째 메소드 완료되면 앱을 종료하고 앱을 재실행해서 두번째 메소드를 실행하는데요. 불필요한 앱 재기동을 없애고 싶은데 혹시 이런 경험있으신지 궁금합니다.

1개의 답글