최근에 배운 게 TDD(Test Driven Development)이다.
Embedded 에는 적용하기 적합하지 않은 경우가 많아서, 사실 큰 관심을 두지 않았다.
그러다가, C#으로 툴을 만들다 보니,(그냥 TDD 연습도 해볼겸)
TDD 적용을 해보려고 시도해보았다.
익히 들은 googletest/googlemock은 C# 에는 적용이 힘들다.
애초에 C# 언어자체의 뿌리가 C/C++과는 판이하게 다르다. (오히려 java쪽에 더 가깝다)
어쨋든 단순하게는 컴파일러가 다르니, 적용이 불가능하다.
외부 프로젝트로 구성해서 적용은 가능하리라 생각하지만, 굳이 해볼 이유는 없어 보인다.
왜냐하면, 언어별로 Unit Test Framework가 있으니까.
C#에는 대략 다음의 3가지 Unit Test Framework를 적용가능하다.
- NUnit
- xUnit
- MSTest
이 중에 가장 오래된 건 NUnit이고, 최근에는 xUnit이 활발하게 사용된다(ChatGPT한테 물어보니 잘 알려주네)
이 중 가장 최근에 많이 사용되는 xUnit을 써보기로 했다.
1. C# WPF Application 에 xUnit 을 이용한 TDD 개발 준비
C# WPF Application 이니까, 당연히 Visual Studio 에서 작성한다.
내가 사용한 툴은 Visual Studio 2022 이다.
처음에는 UnitTest 코드를 WPF Application 안에 포함시키려 했는데,
프로젝트에 테스트 코드가 포함되면, 별다른 조치를 취하지 않으면, 실행 바이너리에 포함되게 된다.
빌드 옵션으로 처리를 할 수 있겠지만, 많이 번거롭다. (또한 필요한 요소들을 전부 따로따로 설치해줘야 하는 번거로움이 있다.)
하지만 소규모의 프로젝트에 간단한 확인이나, 임시로 테스트 하는 목적이라면, 그냥 포함시켜도 괜찮을 것 같다.
xUnit 준비하기 - 기존 프로젝트에 추가
Visual Studio 2022의 솔루션 탐색기에서, 프로젝트에 우클릭을 하면, Nuget 패키지 관리는 항목이 있고, 이걸 클릭하자
xUnit으로 검색해서 나오는 것들 중에 다음 패키지를 설치하자
- xunit
- xunit.runner.visualstudio(이걸 설치안하면, Test Code가 실행이 안된다.)
- Moq
- mocking 을 하려면 필요하다.
그럼 기본적인 준비는 끝났다.
같은 프로젝트 안에 추가하는 거라, 복잡하지 않다.
xUnit 준비하기 - 별도의 테스트 프로젝트 생성
(1) Visual Studio 2022의 솔루션에 테스트 용 프로젝트를 추가하자
솔루션 탐색기를 우클릭해서 새 프로젝트를 생성할때, xunit으로 검색하면, C# 용 xunit project 템플릿이 나온다.
이걸 클릭해서 프로젝트를 생성하고 추가하자.
이렇게 하면, 따로 Nuget 패키지 관리자에서 xunit 관련 패키지를 따로 설치안해도 된다.
하지만, 따로 해야되는 일은 있다.
(2) xUnit을 최신으로 업데이트 하기
테스트 프로젝트를 생성하면서, 기본으로 추가된 xunit 패키지의 버젼이 낮을 수 있다.
프로젝트를 우클릭 한다음 Nuget 패키지 관리자를 열어서, 설치된 xunit 관련 패키지들을 최신으로 업데이트 하자.
(3) 개발 프로젝트를 종속성 항목에 추가하기
별개의 프로젝트이기 때문에, 개발 프로젝트에서 구현한 클래스 등에 접근하려면 종속성에 개발 프로젝트를 추가해야 한다.
프로젝트 우클릭 → "참조 추가" 또는 "종속성" 우클릭 → "프로젝트 참조 추가" 선택
참고로 테스트 프로젝트에서 개발 프로젝트 내에 구현된 클래스에 접근하기 위해서는 internal 지시자가 있으면, 접근이 안된다.
public 으로 변경해주자.
(4) 개발 프로젝트가 WPF Application 인 경우, 발생하는 에러 해결하기
개발 프로젝트가 WPF Application인 경우, 3번까지 하면, 아래와 같은 문제가 생긴다.
'net7.0-windows7.0'을(를) 대상으로 하며, '.netcoreapp,version=v7.0'을(를) 대상으로 하는 프로젝트로는 참조할 수 없습니다. |
처음에 이게 무슨 소리인가 했다.
데자뷰처럼 옛날에도 비슷한 일이 있었던 거 같은데... 기억이 안난다.(있었던 일인지조차 헷갈린다.)
문제는 WPF Application은 TargetFramework가 net7.0-windows7.0 또는 net8.0-windows7.0 이런식으로 설정된다.
csproj 파일을 열어보면, 아래와 같이 되어 있었다.
<TargetFrameworks>net7.0-windows7.0</TagetFrameworks>
그리고 xunit 테스트 프로젝트를 열어보면, 이렇게 되어 있었다.
<TargetFrameworks>net7.0</TagetFrameworks>
결론은 둘 간의 TargetFramework 이 달라서 안된다는 거다.
근데, 웃긴 건, xunit 프로젝트를 우클릭해서 나오는 UI 에서 변경도 안된다는 거다.
결국 csproj에서 손으로 고쳐줬다. 하는 김에 둘 다 8.0으로 변경했다.
<TargetFrameworks>net8.0-windows7.0</TagetFrameworks>
자 이렇게 하니 문제가 사라졌다.