태그 보관물: unittest

Rust와 Python unit test의 공존

예전 글에서 vscode의 test explorer에 Rust의 unittest가 보이도록 설정하는 방법을 다룬 적이 있었는데, 여기에 Python test case (여기서는 pytest)도 함께 표시되도록 하려면 .vscode/settings.json을 편집해 주어야 한다.

해당 프로젝트의 경우 가상환경을 source root에 두지 않고 서브 디렉토리인 service/.venv 안에 넣어 두었기 때문에 python.defaultInterpreterPath 값을 이곳으로 직접 설정해 주고 pytest 사용을 위한 설정도 해 두었다.

{
    // Rust unit test
    "rust-analyzer.testExplorer": true,

    // Python virtual environment용 인터프리터 설정
    "python.defaultInterpreterPath": "${workspaceFolder}/service/.venv/bin/python", 
    
    // pytest 사용
    "python.testing.pytestEnabled": true,
    "python.testing.unittestEnabled": false,

    // Python unit test가 있는 디렉토리 경로
    "python.testing.pytestArgs": [
        "service/test"
    ],
    "python-envs.defaultEnvManager": "ms-python.python:venv"
}

그리고 나서 vscode GUI에서도 다시 한번 venv를 설정해 준다. 그냥 프로그램을 재 실행 했으면 이 부분은 건너 뛰어도 되었을 것 같긴 한데, 오류가 계속 뜨길래 수동으로 설정해 주었다.

이렇게 하고 나면 test explorer에 두 언어의 test case들이 모두 표시되는 평화로운 공존상태가 된다.

VScode test explorer에 Rust 테스트 케이스 표시

rust-analyzer extension을 설치했는데도 test explorer에서 rust unit test가 표시되지 않는 경우는 다음을 확인해 보자.

Command palette을 열어서 open settings를 검색한다.

왼쪽 pane에서 Extensions -> rust-analyzer를 선택하고 Test Explorer 항목을 찾아 "Show the Test Explorer view."가 체크되어 있는지 확인한다.

한참을 찾았는데 결국은 이게 disabled된 것이 원인 이었다.

이 항목을 체크하고 나면 vscode를 재실행 하겠다는 창이 뜨고, 재실행 뒤에는 unittest가 text explorer에 표시된다.

참고로 UI를 통해서가 아닌 JSON 파일을 직접 수정하려면 settings.json을 열어서 다음을 추가해 주어도 된다.

{
...
    "rust-analyzer.testExplorer": true,
}

VSCode에서 GTest 테스트 항목 표시하기

VSCode의 Test Explorer에 test case들을 표시하면 귀찮은 파라미터 입력 없이도 특정 테스트케이스를 실행하거나 디버그할 수 있어서 여러모로 편리한 점이 많다. 하지만 GTest로 작성한 C++ 테스트케이스들은 자동으로 discover되지 않아서 약간의 설정을 해주어야 한다. 복잡한 것은 아니고 아래와 같이 GTest에서 제공하는 CMake 함수인 gtest_discover_tests()를 이용하면 된다.

# Allow ctest to discover unittests.
enable_testing()
include(GoogleTest)
gtest_discover_tests(
    ${TEST_EXE}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)

gtest_discover_tests() 자세한 내용은 GoogleTest CMake 문서에서 찾을 수 있으니 참고 하도록 하자. 여기에서는 target을 실행파일의 이름으로, working directory를 build로 설정해 주었다. 전체 코드는 아래와 같다.