pytest와 pytest-cov를 저는 같이 쓰는 편입니다. report를 할 때 굳이 coverage 측정이 필요 없는 것이 있을 텐데요. 이들을 제외하는 방법을 알아보겠습니다.

 

 pytest는 7.2.2, coverage는 7.2.2, pytest-cov는 4.0.0 버전에서 실습하였습니다.

 


 먼저, 프로젝트 request_ex의 구조입니다. pg1 패키지에 a.py가 있고, pg2 패키지에 b.py가 있습니다.  다음에 root에 main.py가 있고, .coveragerc가 있는데요. 이 .coveragerc는 coverage 관련 설정을 적어놓습니다.

 

 

 main.py입니다. pg1.a로부터 feature_a를 import하고, pg2.b로부터 feature_b를 import 했네요. test_a에는, feature_a(1)과, feature_b(3)을 호출합니다. 다음에 pyest main.py --cov를 입력해 보겠습니다.

 

 그랬더니, main.py, pg1/__init__.py, pg1/a.py, pg2/__init__.py, pg2/b.py의 커버리지가 출력됩니다. 토탈 coverage는 85%라고 출력되는군요. 어디서 cover를 깍아먹었는지 html 형식으로 report 해 보겠습니다.

 

 프로젝트의 root 폴더에서 python main.py --cov --cov-report=html을 입력해 보겠습니다. 그러면, htmlcov라는 폴더가 하나 새로 생길 겁니다. index.html로 들어가 보겠습니다.

 

 표 형식으로 Statements, missing, excluded가 나오는 것을 볼 수 있어요. Module에 있는 pg1/a.py를 클릭해서 들어가 봅시다.

 

 그러면 missing이 보이는데요. feature_a(1)을 호출하였습니다. x > 1인 경우를 호출하지 않았기 때문에, 5번째 줄이 전혀 실행이 안 됩니다. 따라서, 1 missing이 뜨게 됩니다.

 

 feature_b는 어떨까요? x가 3인 경우만 호출했기 때문에, x <= 1 조건에 걸리는 문장이 수행되지 않습니다. 1 missing입니다. 간단하게 요래 보시면 되겠습니다.

 


 우리는 .coveragerc에서 [run]에 omit 옵션을 줄 수 있습니다. 잠깐. 여기서 omit은 제외하다라는 뜻이 있어요. 3번째 줄부터 5번째 줄까지 앞에 space 4개를 붙였습니다. 이 리스트들이 있는데요. pg1/**, main.py, *__init__.py가 있네요. 이 패턴들은 문서에 자세히 설명이 되어 있습니다만, 요약해서 설명드리겠습니다.

 

 먼저 **는 몇 개의 directory도 상관이 없고, 심지어 아무 것도 없어도 됩니다. gitignore에서 **을 생각하시면 편하겠습니다. 다음에 *는 문자 0개 이상인 파일 이름인데요. /와 같은 디렉토리 구분자를 제외합니다. ?는 하나의 파일 문자를 의미합니다. 어떤 것이 제외되는지 보겠습니다.

 

 

 먼저 pg1/**입니다. pg1 밑에 있는 .py 파일도 당연하게 제외됩니다. 다음에 *__init__.py가 있는데요. pg2 밑에 있는 __init__.py도 여기에 걸립니다. 따라서 pg2/__init__.py도 제외됩니다. 그리고 main.py는 root 디렉토리에 있는데요. main.py도 제외하라고 했으니, 이것도 제외됩니다.

 

 다시 python main.py --cov --cov-report=html를 입력합니다. 다음에, htmlcov 밑에 있는 index.html에 들어가 보면, pg2/b.py만 report에 나옴을 볼 수 있습니다. 즉, .coveragerc에 [run] 옵션에 omit = 을 적어주고, 제외할 파일들의 패턴을 적어주면 됩니다.