본문 바로가기
공부/파이썬 Python

Python pytest 테스팅 기초 (QA) 01강

by 혼밥맨 2022. 2. 1.
반응형

Python pytest 테스팅 기초 (QA) 01강

 

 

01 PyTest 설치

1
pip install pytest
cs

 

02 PyCharm 환경설정 변경

PyCharm - Settings (Preferences) - Tools - Diff & Merge - Python Integrated Tools - Testing - pytest

 

 

03 pytest 설치 확인

PyCharm - Terminal - Local - Command - pytest 입력하고 엔터

 

 

04 New PyCharm 프로젝트 만들기

 

 

05 New File (test_ch1.py) 만들기

1
2
3
4
5
6
7
8
9
10
11
12
# argument로 이름 (문자열 타입)을 받고
# 이름 내 모음 개수를 반환하는 함수 작성하기
 
def vowel_count(string):
    vowels = ['a''e''i''o''u']
    count = 0
    for ch in string:
        if ch in vowels:
            count = count + 1
    return count
 
print(vowel_count("honbobman")) # 본인의 이름을 pass
cs

"honbobman"이라는 문자열에는 3개의 모음 ('o', 'o', 'a')이 있습니다. 그러므로 'vowel_count' 함수는 integer 3을 반환할 것입니다.


06 테스트 케이스 작성하기

1
2
3
4
5
6
def test_with_my_first_name():
    assert vowel_count('honbobman'== 3
 
 
def test_with_my_last_name():
    assert vowel_count('choi'== 2
cs

이름을 '성' (lastname)과 '이름' (firstname)으로 나누어서 테스트 케이스를 작성했다.

 

 

07 테스트 케이스 실행하기

Settings - Python Integrated Tools - pytest로 설정했다면 테스트 케이스를 작성하면 라인 넘버 옆에 초록색 재생 버튼이 생성된다. 테스트 케이스를 실행하려면 초록색 재생 버튼을 누르면 된다. 

test_with_my_first_name PASSED. 'honbobman'이라는 문자열에 모음이 3개가 있어서 Pass 했다.

'choi'이라는 문자열에 모음이 2개가 있어서 Pass 했다.

 

만약 테스트 케이스를 일부러 틀리게 작성하면 어떻게 될까? 'test_with_my_last_name' 테스트 케이스에 'choi'를 패스하고, 예상 반환값에 2가 아닌 4를 넣어보자.

당연히 (?) 아래와 같이 에러 코드가 등장한다. 실제값과 테스트 케이스의 예상값이 다르다는 내용이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
============================= test session starts =============================
collecting ... collected 1 item
 
test_ch1.py::test_with_my_last_name FAILED                               [100%]
test_ch1.py:19 (test_with_my_last_name)
2 != 4
 
Expected :4
Actual   :2
<Click to see difference>
 
def test_with_my_last_name():
>       assert vowel_count('choi'== 4
E       assert 2 == 4
E         +2
E         -4
 
test_ch1.py:21: AssertionError
 
 
============================== 1 failed in 0.10s ==============================
cs

 

 

07 테스트 케이스 수정하기

사실 위 작성한 테스트 케이스에는 오류가 있다. 고의적으로 오류가 발생하도록 테스트 케이스를 작성해보자.

1
2
3
4
5
6
def test_with_my_first_name():
    assert vowel_count('HONBOBMAN'== 3
 
 
def test_with_my_last_name():
    assert vowel_count('CHOI'== 2
cs

함수에 이름을 패스할 때 대문자로 패스하면 테스트 오류 결과가 발생할 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
============================= test session starts =============================
collecting ... collected 1 item
 
test_ch1.py::test_with_my_first_name FAILED                              [100%]
test_ch1.py:15 (test_with_my_first_name)
0 != 3
 
Expected :3
Actual   :0
<Click to see difference>
 
def test_with_my_first_name():
>       assert vowel_count('HONBOBMAN'== 3
E       assert 0 == 3
E         +0
E         -3
 
test_ch1.py:17: AssertionError
 
 
============================== 1 failed in 0.11s ==============================
cs

 

그렇다면 함수에 이름을 패스할 때 이름이 소문자이거나 대문자이거나 모두 제대로 테스트될 수 있도록 수정하자. 

1
2
3
4
5
6
7
def vowel_count(string):
    vowels = ['a''e''i''o''u']
    count = 0
    for ch in string.lower():
        if ch in vowels:
            count = count + 1
    return count
cs

 

 

08 더 많은 테스트 케이스 작성하기

위에는 이름의 모음 개수를 카운트 했다. 이제는 자음의 개수를 테스트하는 테스트 케이스를 작성해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def consonant_count(string):
    vowels = ['a''e''i''o''u']
    count = 0
    for ch in string.lower():
        if ch not in vowels:
            count = count + 1
    return count
 
 
def test_with_my_first_name_consonant():
    assert consonant_count('HONBOBMAN'== 6
    assert consonant_count('HONBOBMAN'== len('HONBOBMAN'- vowel_count('HONBOBMAN')
 
def test_with_my_last_name_consonant():
    assert consonant_count('CHOI'== 2
    assert consonant_count('CHOI'== len('CHOI'- vowel_count('CHOI')
cs

결과는 역시 PASSED! 구체적이고 섬세한 테스트 케이스를 작성하고 테스트하는 것이 소프트웨어 품질을 결정한다고 볼 수 있다. 테스트 케이스 작성하는 일이 재미 없고 지루할 수도 있어도 소프트웨어의 품질을 결정하는 것뿐만 아니라 미래의 소프트웨어 기획에도 영향을 미친다.

 

반응형

댓글