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 |