안드로이드 유닛 테스트 – 명명 규칙 선택 및 테스트 사례

2022.03.15

|

1282

*잠깐, 이 글을 소개해드리는 위시켓은 2019년 시밀러웹 방문자 수 기준, 국내 1위 IT아웃소싱 플랫폼입니다.

현재 9만 이상의 개발업체, 개발 프리랜서들이 활동하고 있으며, 무료로 프로젝트 등록이 가능합니다. 프로젝트 등록 한 번으로 여러 개발업체의 견적, 포트폴리오 예상기간을 한 번에 비교해보세요🌼

버그 없는 Android 앱 구축

Android 유닛 테스트 - 명명 규칙 선택 및 테스트 사례
안드로이드 유닛 테스트



유지 관리성(Maintainability)은 코딩 시 목표들 중 하나입니다. ‘유닛 테스트’의 장점들 중 하나의 코드를 더 쉽게 유지 관리할 수 있다는 점인데, 장점들을 확인하려면 다음 링크를 확인해보기를 추천드립니다. https://betterprogramming.pub/android-unit-testing-basics-78a04a66124a

그러나 만일 ‘유닛 테스트’에 잘못된 코드가 있고 기존의 기능을 변형해야 한다면, 프로덕션 코드와(잘못된 코드와 함께) ‘유닛 테스트’도 변경해야 합니다.

‘유닛 테스트’는 코드를 유지 관리할 수 있도록 해주지 않고 그 대신에 정확히 무엇이라고 작성된 것인지 읽고 이해하려고 노력하는 것에 많은 시간을 소모하게 되어 지옥이나 함정과 같을 수 있습니다!

즉 ‘유닛 테스트’를 통해 코드를 더 쉽게 유지 관리할 수 있도록 하려면 이를 최대한 깔끔하게 만들어야 합니다. 그렇게 하지 않을 경우, 경미한 변화도 큰 문제가 될 것입니다.

테스트 코드는 프로덕션 코드만큼 중요하다. 2번째 계급의 것이 아니다. 테스트 코드는 사고, 디자인, 관심이 필요하다. 프로덕션 코드와 마찬가지로 깔끔하게 유지되어야 한다.

– Robert C. Martin, Clean Code: A Handbook of Agile Software Craftsmanship

테스트 메서드 이름 선택



깔끔하게 코드를 작성하는 가장 인기있는 가이드라인 중 하나는 메서드(Method)와 변수에 적절한 이름을 선택하는 것입니다. 다음의 팁을 따라서 프로젝트를 위한 적절한 테스트 메서드 이름을 선택할 수 있습니다.

가독성: 가독성은 단순하고, 표현력이 풍부하고, 의미가 있는 이름을 선정함으로써 달성된다.

하나의 명명 규칙: 프로젝트에는 하나의 명명 규칙을 사용하는 것이 더 좋은데, 이는 테스트 보고서 읽기를 더 이해하기 쉽고 일관성 있게 수행할 수 있게끔 해준다.

그러나 어떤 경우에는 당신이 또다른 레이어에 있는 경우 또다른 규칙을 사용할 수 있습니다.

예를 들어, 어떤 개발자들은 다음 규칙을 좋아하지 않습니다.

MethodName_StateUnderTest_ExpectedBehavior



그 이유는 메서드 이름 그리고 ‘유닛 테스트’는 코드가 아닌 동작을 테스트해야 한다는 인수를 포함하고 있기 때문입니다. 이는 테스트 코드가 프로덕션 코드를 변경하여 영향을 주지 않아야 함을 의미합니다. 이 규칙은 테스트 메서드를 프로덕션 코드에 밀접하게 결합했는데, 이는 프로덕션 코드에서 메서드 이름을 변경한다면 이 메서드를 테스트하는 ‘테스트 메서드’에 대한 변경을 해야 한다는 것을 의미합니다.

앞서 언급한 것처럼 코드가 아닌 동작을 테스트하는 것이기 때문에 밀접한 결합이 이루어졌지만, 유틸리티 클래스를 테스트한다면 이 규칙에는 메서드 이름이 포함되어 있어 추적이 더 가능해져서 해당 규칙을 사용할 수 있습니다.

따라서 비즈니스 논리의 경우 예를 들어,

When_StateUnderTest_Expect_ExpectedBehavior

처럼 메서드 이름이 포함되지 않은 명명 규칙을 사용할 수 있고, 동작이 아닌 테스트 코드가 요구되는 메서드를 위한 메서드 이름을 포함하고 있는 다른 규칙을 사용합니다.

명명 규칙의 사례

많은 명명 규칙이 있는데, 다음은 그들 중 일부입니다.

· MethodName_StateUnderTest_ExpectedBehavior

– 예시: getPost_success_postShouldCached

· MethodName_ExpectedBehavior_StateUnderTest

– 예시: getPost_postShouldCached_success

· Should_ExpectedBehavior_When_StateUnderTest

– 예시: should_throwException_when_NetworkError

· l When_StateUnderTest_Expect_ExpectedBehavior

– 예시: when_serverError_expect_postNotCache

규칙이 설명을 포함하고 있는 한, 명명 규칙의 선택에는 옳고 그름이 없습니다. 이는 개발자와 그 개발자가 선호나는 것에 달려 있습니다.

가독성이 더 좋다

Kotlin 같은 일부 최신 언어에서는 공백과 함께 테스트 메서드를 작성할 수 있습니다.

따라서 가독성이 더 좋습니다! 예를 들어, 다음 규칙(When_StateUnderTest_Expect_ExpectedBehavior)은 아래와 같습니다.

안드로이드 유닛 테스트 메서드

테스트 사례 선택



경우의 수는 무한하기에 가능한 모든 경우를 테스트할 수는 없고, 대신에 테스트 중인 함수의 입력/인수를 사례에 따라 범주와 경계로 나누고 각 범주와 경계에서 값을 골라 테스트합니다.

테스트 사례에 특정한 수는 없고, 각 경우에 따라 다릅니다. 그러나 코드 커버리지(code coverage)가 100%가 아니라면 테스트 코드를 더 작성해야 하지만, 100%라고 해서 우리가 가능한 모든 경우를 포함한다는 것을 의미하지는 않습니다. 다음 사례를 참고하면 더 명확히 이해될 것입니다.

사례 #1: String Duplicator(문자열 복제기)

다음과 같이 duplicateString 메서드가 있는 StringDuplicator 클래스가 있다고 가정합시다.

안드로이드 유닛 테스트 문자열 복제기

일부 문자열을 복제하고 싶다면 인수/입력(이 경우 string(문자열))을 빈 세 가지 범주, 한 문자, 그리고 여러 문자들로 나눌 수 있습니다. 우선 테스트 사례를 하나 추가해 커버리지로 실행해봅시다.

안드로이드 유닛 테스트 문자열 커버리지

커버리지로 실행하기 위해 다음과 같이 ‘범위를 포함하여 StringDuplicatorTest 실행’을 선택할 수 있습니다.

안드로이드 유닛 테스트 커버리지 실행

결과는 테스트 기능이 모든 라인을 다뤘기에 100%일 것입니다.

안드로이드 유닛 테스트 StringDuplicator

그러나 우리는 StringDuplicator 커버리지가 100%임에도 아직 모든 테스트 사례들을(앞서 언급한 3가지 범주) 다루지는 않습니다.

모든 테스트 경우를 다루기 위해, 두 개의 테스트 사례를 추가할 수 있는데, 테스트 코드는 다음과 같을 것입니다.

안드로이드 유닛 테스트 코드 확인하기

사례 #2: Conflict Meetings Detector

우리에게 다음과 같이 haveMeetingsConflict 메서드를 가진 ConflictMeetingsDetector가 있다고 가정해봅시다.

안드로이드 유닛 테스트 메서드 가정

그래서 여기에서 인수(이 사례에서는 MeetingInterval1과 MeetingInterval2)를 아래 사진과 같은 범주들로 나눌 수 있습니다.

안드로이드 유닛 테스트 범주

테스트 코드는 다음과 같을 것입니다.

안드로이드 유닛 테스트 인수 테스트 코드



우리는 모든 범주를 다뤘고, ‘커버리지와 함께 실행’또한 우리에게 100%를 제공합니다. 그러나 아직 끝이 아닙니다. 이 ‘유닛 테스트’에서 인수를 범주와 경계로 나눌 수 있는데, 우리는 아직 경계를 다루지 않았습니다.

경계/엣지(edge)의 사례를 잊기 쉽습니다. 많은 버그들이 그 경계로부터 발생합니다. 따라서 범주와 경계로 인수를 나눌 때는 주의를 기울여야 합니다.

경계를 다루기 위해, 아래 사진과 같이 두 가지의 새로운 테스트 사례를 추가할 수 있습니다.

안드로이드 유닛 테스트 사례

또한 다음과 같이 두 가지 새로운 테스트 기능들이 추가됩니다.

안드로이드 유닛 테스트 새로운 코드

GitHub의 전체 코드는 다음 링크에서 찾을 수 있습니다.

https://github.com/haythamayyash/android-unit-testing-course

끝내는 말



‘유닛 테스트’는 프로덕션 코드만큼 중요합니다. 유닛 코드를 유지 관리할 수 있게 테스트 코드를 가능한 최대한 깔끔하게 유지해야 하기 때문에 ‘유닛 테스트’가 도움이 되고, 그렇지 않을 경우 단위 테스트가 코드를 복잡하고 유지 관리하기 어렵게 만듭니다.

인수/입력을 범주와 경계로 나눠 올바른 테스트 사례를 선택할 수 있습니다.

또한 100% 미만의 커버리지는 더 많은 테스트 사례를 추가해야 함을 의미하지만 100% 커버리지가 가능한 모든 경우를 다 다룬다는 의미는 아닙니다.

출처:  https://betterprogramming.pub/android-unit-testing-choosing-naming-convention-and-test-cases-d1a3122ac28a

국내 1위 IT아웃소싱 플랫폼,

위시켓이 궁금하신가요?

앱 개발 비용 궁금하세요?
위시켓이 바로 알려드릴게요!

안드로이드 유닛 테스트유닛 테스트유닛 테스트 방법유닛 테스트 코드유닛 테스트란
다음 글

위시켓 블로그의 새로운 소식 받기