※ Pytest를 지원하는 Python 버전은Python 3.6, 3.7, 3.8, 3.9, PyPy3 이다.
1. Windows 명령 프롬프트 혹은 MacOS 터미널에 다음 명령어를 입력한다.
$ pip install -U pytest
2. 설치 과정이 끝나면, 다음 명령어를 입력하여 Pytest의 버전이 뜨는지(= 제대로 설치 되었는지) 확인한다.
$ pytest --version
pytest 6.1.2 // 제대로 설치 된 경우 출력
Pytest 사용 방법
일반 라이브러리를 사용하듯이 Python 스크립트에 pytest 모듈을 import하여 사용한다.
단, Python 스크립트 파일명과 테스트 결과를 확인할 함수명은test_로 시작 혹은 _test로 끝나야 한다.
※ 파일명/함수명을 지키지 않으면, pytest에서 test 대상으로 인지하지 못해 다음과 같이 Collected 0 item 으로 나타난다.
$ pytest test.py
================================== test session starts =======================================
platform win32 -- Python 3.8.3, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\User
collected 0 items
================================= no tests ran in 0.02s ======================================
예시)
동일한 Python 스크립트를 일반 Python으로 실행 VS Pytest로 실행
# 파일명 : test.py
import pytest
def test_success():
test = 'Test Success !!'
print(test)
assert 'Success' in test // Test 결과 판별 기준
def test_fail():
test = 'Test Failed !!'
print(test)
assert 'Success' in test // Test 결과 판별 기준
test_success() 와 test_fail() 이라는 함수 두개만 선언되어 있고, main 에서 함수를 호출하지 않기 때문에
일반 Python으로 실행시켰을 때는 아무런 동작도 표시되지 않는다.
$ python test.py
test.py를 pytest로 실행하면, 다음과 같은 테스트 결과가 나타난다.
$ pytest test.py
===================================== test session starts =================================================
platform win32 -- Python 3.8.3, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\User
collected 2 items
PycharmProjects\test\test.py .F [100%]
========================================== FAILURES =======================================================
__________________________________________ test_fail ______________________________________________________
def test_fail():
test = 'Test Failed !!'
print(test)
> assert 'Success' in test
E AssertionError: assert 'Success' in 'Test Failed !!'
PycharmProjects\test\test.py:11: AssertionError
------------------------------------ Captured stdout call -------------------------------------------------
Test Failed !!
=================================== short test summary info ===============================================
FAILED PycharmProjects/test/test.py::test_fail - AssertionError: assert 'Success' in 'Test Failed !!'
================================= 1 failed, 1 passed in 0.13s =============================================
test_success() 함수의 결과는 Pass로 따로 출력되지 않았고,
test_fail() 함수의 결과만 어느 부분에서 테스트가 실패했는지 친절하게 테스트 결과가 표시 된다.
+)
테스트 결과뿐만 아니라, 콘솔에 내용을 출력하고 싶다면 -s 옵션을 사용한다.
$ pytest test.py -s
====================================== test session starts =================================================
platform win32 -- Python 3.8.3, pytest-6.1.2, py-1.9.0, pluggy-0.13.1
rootdir: C:\Users\HyeJungSeo
collected 2 items
PycharmProjects\test\test.py Test Success !! // test_success() 출력결과 확인
.Test Failed !! // test_fail() 출력결과 확인
F
========================================== FAILURES =======================================================
___________________________________________ test_fail ______________________________________________________
def test_fail():
test = 'Test Failed !!'
print(test)
> assert 'Success' in test
E AssertionError: assert 'Success' in 'Test Failed !!'
PycharmProjects\test\test.py:11: AssertionError
==================================== short test summary info ===============================================
FAILED PycharmProjects/test/test.py::test_fail - AssertionError: assert 'Success' in 'Test Failed !!'
================================== 1 failed, 1 passed in 0.08s =============================================
다음은 JSON 파일을 이용하는 방식으로, 스크립트 언어가 익숙치 않은 사람들에게 유용한 방식이라고 생각 된다.
APPIUM 서버를 실행할 때 --default-capabilities flag 옵션으로 Desired Capabilities를 정의할 수 있는데,
Desired Capabilities 속성이 정의된 JSON 파일명 입력만으로 손쉽게 정의할 수 있다.
다만 단점은 이 때 설정한 값은 처음 세션이 시작할 때만 적용되고, 이후 스크립트 내부에서는 해당 속성값을 사용할 수 없다는 것이다.
이 때 사용할 JSON 형식은 Object xpath, id 값을 찾는 Inspector Sesstion 자연스럽게 생성할 수 있다.
이렇게 생성된 JSON은 명령어에 직접 이용 혹은 JSON 파일로 저장하여 이용할 수 있다.
# 명령어에 직접 이용
APPIUM --default-capabilities '{"app": "myapp.app", "deviceName": "iPhone Simulator"}'
# Windows CMD 사용 시 \ 필수
APPIUM --default-capabilities "{\"app\": \"myapp.app\"}"
# JSON 파일 저장 후 이용
APPIUM --default-capabilities /path/to/file.json
세번째. CLI 방식
마지막은 CLI 속성을 이용하는 방식인데, --app, --platform-version 등 속성값을 입력하면 자동으로 JSON 형식으로 변환해 Desired Capabilities를 정의하는 방식이다. 즉, JSON 이용 방식과 마찬가지로 스크립트 내부에서는 해당 속성값을 사용할 수 없다는 단점이 있다.
CLI 속성에는 Desired Capabilities 속성값 외 포트번호라든가, log 출력 형식 등 APPIUM 서버 동작을 위한 유용한 속성들도 많아서 참고해서 활용하면 훨씬 편리하게 테스트 자동화를 진행 할 수 있다.
Microsoft Windows [Version 10.0.18363.1198]
(c) 2019 Microsoft Corporation. All rights reserved.
C:\Windows\system32>httpd
AH00526: Syntax error on line 539 of C:/httpd-2.4.46-win64-VS16/Apache24/conf/httpd.conf:
Invalid command 'PHPIniDir', perhaps misspelled or defined by a module not included in the server configuration
AndroidStudio 에서는 빌드 결과물로 APK(Android 애플리케이션 패키지)와 AAB(Android App Bundle) 두 가지 형태를 제공한다.
흔히 앱 설치 파일로 알고 있는 APK는 Gradle에서 설정한 API 버전에 해당하는 모든 설치 파일이 압축되어 있는 형태로, Android 버전과 상관없이 동일한 파일로 앱을 설치한다. 반면, Android App Bundle은 다운로드 요청 시 사용자 단말 버전에 해당하는 API만 추출하여 빌드한 APK로 앱을 설치한다. 즉, Android App Bundle 형태로 빌드한 APK의 경우 필요한 API 버전만 포함하고 있어, 기존 방식의 APK 보다 현저히 작은 용량으로 앱을 제공한다.
실제로 Google Playstore에 앱을 등록할 때는 aab 형식을 권장하고, 테스트 과정에서 apk로만 테스트 할 경우 aab 설치 방식에서만 나타나는 이슈를 확인하지 못하는 경우도 있다.
/* 디렉토리로 이동 */
cd C:\Users\사용자이름\AndroidStudioProjects\프로젝트이름\app\build\outputs\bundle\debug
/* bundletool 버전 확인 */
java -jar bundletool파일명 version
예시)
Microsoft Windows [Version 10.0.18362.1139]
(c) 2019 Microsoft Corporation. All rights reserved.
C:\Users\Username> cd C:\Users\Username\AndroidStudioProjects\Myapplication\app\build\outputs\bundle\debug
C:\Users\Username\AndroidStudioProjects\Myapplication\app\build\outputs\bundle\debug> java -jar bundletool-all-1.3.0.jar version
1.3.0
3. bundletool을 이용하여 APK 파일 설치
① 앱 설치할 스마트폰 USB 디버깅 모드로 PC 연결 ※ adb devices 명령어로 연결상태 확인
② bundletool로 연결된 스마트폰 버전에 맞는 APKs 생성 ※--connected-device 옵션을 생략하면, 모든 API 버전을 포함하는 APKs 생성
Gradle 은 Groovy를 기반으로 한 오픈 소스 형태의 빌드 자동화 도구로 DSL을 스크립트 언어로 사용한다. 실행할 처리 명령들을 모아 만든 태스크 단위로 실행하며, 이전에 사용했던 태스크를 재사용하거나 다른 시스템의 태스크를 공유하는 빌드 캐시 기능을 지원하여 향상된 빌드 속도를 제공한다.
AndroidStudio 에서 프로젝트를 생성하면 기본적으로 gradle 빌드 구성 파일을 포함한다.
Android 앱 모듈의 기본 프로젝트 구조 (출처 : Android 개발자 사이트 )
build.gradle(Module: app) 예시 코드
apply plugin: 'com.android.application' // 프로젝트 패키지명
android {
compileSdkVersion 28 // API 28 이하 버전 지원
buildToolsVersion "29.0.2" // SDK 29.0.2 버전으로 빌드
defaultConfig {
applicationId 'com.example.myapp' // 앱 고유 식별 ID
minSdkVersion 15 // 최소 지원 API 버전
targetSdkVersion 28 // 테스트 시 이용할 API 버전
versionCode 1 // 앱 버전
versionName "1.0" // 앱 버전 이름
}
buildTypes {
debug { // 디버그용 빌드
applicationIdSuffix ".debug" // 디버그용 빌드 시 앱 ID 변형
}
release {
minifyEnabled true // 코드 축소 사용
shrinkResources true // 리소스 축소 사용
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
free { // free 버전 빌드 변형
applicationId 'com.example.myapp.free' // 빌드 변형 시 앱 고유 ID
applicationIdSuffix ".free" // 위와 동일
}
paid { // paid 버전 빌드 변형
applicationId 'com.example.myapp.paid' // 빌드 변형 시 앱 고유 ID
applicationIdSuffix ".paid" // 위와 동일
}
}
}
dependencies {
implementation project(":lib") // 로컬 라이브러리 모듈 종속 항목 추가
implementation 'com.example.android:app-magic:12.3' // 원격 바이너리 종속 항목 추가
implementation group: 'com.example.android', name: 'app-magic', version: '12.3' // 위와 동일
implementation fileTree(dir: 'libs', include: ['*.jar']) // 로컬 바이너리 종속 항목 추가
implementation files('libs/foo.jar', 'libs/bar.jar') // 위와 동일
}