inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Spring Boot TDD - 입문부터 실전까지 정확하게

거짓 양성과 거짓 음성

거짓 양성, 거짓 음성 질문

159

dev.taeyeong

작성한 질문수 12

2

안녕하세요 규원님. 강의 잘 보고 있습니다.

거짓 양성과 거짓 음성이 의미하는 바가 잘 이해가 되지 않아서 질문드립니다.

수업 중 제공해주신 표에서는:

로 나와 있습니다.

하지만 제가 이해하기로는 정의가 반대인 것 같습니다:

예시로 제시해주신 코로나 검사 사례를 TDD에 적용해서 생각해보면, "코로나에 감염되었는가?"라는 테스트 시나리오가 있을 때:

TDD에서 이 용어들의 정의가 명확히 정해져 있는 건지, 그리고 어느 쪽이 올바른 정의인지 궁금합니다.

감사합니다.

tdd

답변 2

2

이규원

태영님 안녕하세요. 강의 수강해주셔서 고맙습니다. :)

 

강의 내용 중 테스트 양성과 음성이 어떤 의미인지 혼동되시는군요. 종종 발생하는 일이라 오래전에 이 주제로 글을 쓰기도 했으니까 한 번 참고해 보시고요,

소프트웨어 테스팅의 False Positive | 프로그래머 이규원의 웹사이트

 

도움이 되시도록 좀 더 설명을 드려 보겠습니다.

 

우선 코로나 바이러스 테스트 얘기부터 해보면요, 자가 코로가 바이러스 테스트를 아마 해보셨을 것 같은데, 양성 반응이 나오면 코로나 바이러스에 감염된 것(또는 감염되었을 가능성이 매우 높은 것)입니다. 그렇죠?

식품의약품안전처 자료 참고

6. 검사결과가 시험선(T)과 대조선(C)이두 줄로 나타나면 양성으로 선별진료소 등을 방문, PCR 검사를 받아야 합니다. 검사 후엔 자택으로 이동, 결과확인 전까지 자가격리를 해야합니다.

여기서 코로나 바이러스 감염을 양성으로 보는 것은 테스트의 귀무가설(null hypothesis)을 '우리 몸이 코로나 바이러스에 감염되지 않았다'로 설정한 것입니다. 그래서 테스트를 통해서 뭔가 특별한 근거를 발견하지 못했다면 귀무가설을 채택하게 되고 이것을 음성이라고 합니다.

그리고 실제로는 귀무가설을 채택해야 하는데 기각하게 되는 상황(즉, 코로나 바이러스에 감염되지 않았다는 가설을 채택하지 않음)을 일종 오류(type I error), 또는 거짓 양성(false positive)라고 합니다. 그리고 다른 표현이 또 있는데 거짓 경보(false alarm)입니다.

그러니까

귀무가설 기각 = 양성 = 경보

가 됩니다.

 

이제 우리 몸을 시스템으로, 코로나 바이러스를 버그로 치환해보면 귀무가설은 '시스템에 버그가 없다'가 됩니다. 그래서 양성(경보)은 시스템에 버그가 있다는 뜻이고 테스트가 실패해서 프로그래머에게 알려주기를 기대합니다. 그런데 양성이 발생했는데 실제로는 버그가 없다면 테스트가 우리에게 잘못된 경보를 준 것이고 이 양성은 거짓 양성이 됩니다. 반대로 실제로는 버그가 있지만 이 버그를 감지해야 할 테스트가 실패하지 않고 음성 반응을 보이면 이것을 거짓 음성이라고 합니다.

 

질문을 보면 테스트 통과를 양성이라고 혼동하고 계신 것 같습니다. 테스트 시나리오 문구는 귀무가설입니다. 코로나 바이러스 검사 테스트 시나리오를 작성한다면 '우리 몸이 코로나 바이러스에 감염되지 않았다'가 되겠죠. 그리고 테스트가 성공하면 귀무가설을 채택하고 테스트가 실패하면 귀무가설을 기각합니다. 학문적으로 전자를 음성(negative)이라고 하고 후자를 양성(positive)이라고 합니다.

 

혹시 아직도 이해가 잘 안되시면 더 말씀해 주시거나 "what are false positive and false negative in software testing"으로 구글링을 해보시면 도움될 자료들을 많이 보실 수 있을거에요.

1

지호손

좋은 질문과 좋은 답변 감사합니다.

"귀무가설" 을 어떻게 설정하냐에 따라 헷갈리는 부분인 것 같네요.

소프트웨어 테스트에서는 귀무가설이 "유저 시나리오를 만족한다."라고 잘 지정했다는 사실을 기억한다면 이제 착각할 일은 없겠네요 ㅎㅎ !!

UserService, CertificationService 책임 분리 기준 질문

0

20

1

10년간 CTO 활동을 하신 부분에 대한 질문

1

97

2

테스트 시나리오 유효하지 않은 경우는 언제 도출하나요?

1

107

2

테스트 클래스명 을 강의처럼 만드신 이유가 따로 있을까요?

1

121

2

현업에서도 현재와 같은 방식? 으로 TDD를 하는것이 일반적인가요??

1

116

1

아키텍처와 TDD의 오해에 대해 질문드립니다.

1

116

2

임의데이터 generator방식과 @Transactional에 대한 고찰

1

75

2

내부 설계에 의존하는 테스트 관련 질문 드립니다.

1

81

2

테스트 시나리오 관련 질문 드립니다.

1

76

2

@SpringBootTest 어노테이션의 classes 관련 질문 드립니다.

1

68

2

거짓 음성, 거짓 양성 관련 질문 드립니다.

1

86

1

30. 누락된 테스트 시나리오 발견

1

79

2

69.테스트격리 / 과도한 테스트 격리의 문제 중 '부적절한 설계 왜곡'

1

81

2

"오해: 단위 테스트와 통합 테스트를 잘 분리해야한다." 에 대한 질문

1

798

2

아키텍처 개선

1

119

1

병렬 처리 시 질문

0

110

2

assertThat 상태 코드 비교

1

84

1

테스트 격리에서 테스트 랜덤 실패 이유

0

101

2

테스트 코드 작성 범위 고민

1

241

3

질문드립니다.

2

106

1

cqrs 명령 아키텍처 개선 질문

1

147

2

거짓 양성 감지 노하우 질문입니다

4

790

2

질문드립니다.

1

152

2

프로젝트 규모가 큰 경우 @SpringBootTest 실행 속도 문제

2

1615

1