데이터 분석

유닛테스트 작성 시 주의점

temporubato108 2024. 8. 26. 12:22

1. 이름으로 내용을 파악할 수 있어야 한다.

# Bad
def test1():
    assert(is_palindrome("level") == True)

# Good
def test_is_palindrome_level():
    assert(is_palindrome("level") == True)

위 코드에서 test1이라는 테스트코드로는 해당 테스트코드가 어떤 기능을 하는지 알 수 없다.

일반적으로는 코드의 이름을 간결히 하는 것이 좋지만

테스트 코드의 경우에는, 어떤 edge case를 검증하고자 하는지, 어떤 함수에 대한 테스트인지, 어떤 input을 테스트 하려는 것인지 등을 이름에서 알 수 있도록 해야 한다.

 

 

 

2. 각 유닛테스트들은 독립적이어야 한다.

heater = Heater()

def test_control_heater_when_cold():
    heater.current_temperature = -5.0
    heater.preferred_temperature = 18.0
    control_heater(heater)
    assert(heater.is_turn_on == True)
def test_control_heater_when_hot():
    heater.current_temperature = 25.0
    heater.preferred_temperature = 18.0
    control_heater(heater)
    assert(heater.is_turn_on == False)
# Case1
test_control_heater_when_cold() # PASS
test_control_heater_when_hot() # PASS

# Case2
test_control_heater_when_hot() # FAIL
test_control_heater_when_cold() # PASS

위의 함수와 같이, Case1에서 정상적으로 작동하던 코드가, 테스트의 순서를 바꿨더니 비정상적으로 기능하는 경우, 테스트코드가 올바르지 않음을 알 수 있다.

이것은 위의 경우에서는, 두개의 함수가 공유하고 있는 함수나 객체가 존재했기 때문이다.

따라서 각 테스트코드를 독립적으로 만들어 주면 정상적으로 작동한다.

def test_control_heater_when_cold():
	heater = Heater() # 그때그때 새로운 객체 생성
    heater.current_temperature = -5.0
    heater.preferred_temperature = 18.0
    control_heater(heater)
    assert(heater.is_turn_on == True)

위와 같이 테스트에 사용할 객체를 그때 그때 생성하는 것이 좋다.

 

 

 

3. 테스트하는 각각의 함수들은 분리되어야 한다.

def test_heater():
	heater = Heater()
    ...
    assert(heater.is_turened_on == True)
    assert(read_temperature(heater) == "..")

위의 코드에서는 test_heater라는 하나의 테스트 안에서 두 개의 함수를 테스트 하고 있다.

이렇게 되면 코드가 잘못되었을 때, 어느 함수에서 에러가 발생했는지, 원하는 의도대로 동작하지 않았는지를 이 코드에서는 파악할 수가 없게 된다.

따라서 두 함수를 각각 다른 테스트로 분리시켜주는 것이 바람직하다.

 

 

 

4. edge case를 고려해야 한다.

입력될 수 있는 다양한 값들을 고려해야 한다.

지금까지의 경우는 더울때(hot), 추울때(cold) 두 가지의 경우만 고려했지만,

온도가 같을 때, 또는 현재 온도가 측정 불가능할 때 등의 edge case도 고려해야 한다.

def test_control_heater_when_same():
    heater.current_temperature = 18.0
    heater.preferred_temperature = 18.0
    control_heater(heater)
    assert(???)
    
def test_control_heater_temperature_none():
    heater.current_temperature = None
    heater.preferred_temperature = 18.0
    control_heater(heater)
    assert(???)

 

회문 테스트 코드에서 빈 문자열이나 특수부호로만 이루어진 문자열을 고려하는 것과 같다.

한마디로 '다양한 상황을 고려해야 한다'는 것이다.

'데이터 분석' 카테고리의 다른 글

타이타닉 데이터 분석하기  (1) 2024.08.28
인공지능 기초지식  (1) 2024.08.28
is_palindrome 코드 분석  (0) 2024.08.26
실습 Palindrome 테스트  (0) 2024.08.26
테스트 코드와 유닛테스트  (0) 2024.08.26