CLI 도구용 테스트 작성

이번 주에 저는 Shinny-SSG 프로젝트를 위한 테스트 작성 작업을 하고 있었습니다. 테스트를 구현하기 위해 내 코드와 프로젝트의 폴더 구조를 모두 수정해야 했기 때문에 OSD600 과정에서 가장 도전적인 랩이었습니다.

설정



내가 선택한 테스트 프레임워크는 XUnit 입니다. 첫 번째 이유는 NUnits와 같은 다른 테스트 프레임워크에 비해 트렌디하기 때문입니다. Create Unit Tests 명령으로 기존 코드에서 테스트 메서드 스텁을 만들었습니다. Xunit과 함께 사용하려면 내 프로젝트에 XUnit.net.TestGenerator 확장을 구현해야 합니다.

도전



내 도구가 프로그램에 전달된 다른 인수를 사용하여 대상에서 파일과 폴더를 어떻게 생성했는지 테스트하고 싶습니다. 그러나 이전 코드에서는 인수 작업의 모든 논리를 static int main( string[] args) 함수에 넣었습니다. CommandLineUtils에는 이 클래스에 대한 인터페이스가 없기 때문에 인터페이스 및 종속성 주입을 사용하여 CommandLineApplication을 조롱할 수 없습니다. 운 좋게도 CommandLineUtils의 소유자로부터 이 파일guidance을 찾았고 그는 "명령줄 인수 구문 분석기와 응용 프로그램 실행을 별도의 클래스 구조로 분할"하여 프로그래밍 방식으로 다양한 옵션을 테스트하도록 조언했습니다. 훌륭한 제안이며 클래스CommandLineOptions를 추가하고 Generator 클래스의 생성자에 로직을 추가하여 프로그램을 다시 작성했습니다. 코드 리팩토링 및 더 나은 테스트 작성과 같은 변경 사항으로 두 마리 토끼를 잡을 수 있습니다.
내가 가진 또 다른 문제는 내 폴더 구조였습니다. 이전에는 프로젝트의 sln 파일, .git 파일, src 파일을 폴더 루트에 넣었습니다. 그러나 Shinny-SSG에 대한 새 테스트 프로젝트를 추가했을 때 내 git 폴더 외부에 있었고 변경 사항을 커밋하고 원격 저장소에 넣는 것이 불가능했습니다. 이를 해결하기 위해 폴더 구조를 다음과 같이 변경해야 했습니다.

C:.
├───shinny-ssg
│   ├───bin
│   │   ├───Debug
│   │   │   └───netcoreapp3.1
│   │   │       ├───dist
│   │   │       └───publish
│   │   ├───Destination
│   │   └───Release
│   │       └───netcoreapp3.1
│   ├───obj
│   │   ├───Debug
│   │   │   └───netcoreapp3.1
│   │   └───Release
│   │       └───netcoreapp3.1
│   ├───Properties
│   └───src
└───shinny-ssgTests
    ├───bin
    │   └───Debug
    │       ├───.netcoreapp,version=v3.1  
    │       └───netcoreapp3.1
    ├───obj
    │   └───Debug
    │       ├───.netcoreapp,version=v3.1
    │       └───netcoreapp3.1
    └───src


테스트



구성 파일 옵션, 입력 경로 옵션 및 유효하지 않은 입력 경로 옵션의 3가지 경우를 다루는 Generator 클래스run() 함수에 대한 3가지 테스트를 작성했습니다. 내 테스트는 내 응용 프로그램의 큰 버그를 발견하는 데 도움이 됩니다. 이전에는 default 키워드가 변수의 기본값을 지정하는 데 사용된다고 생각했습니다.

 cssUrl = cssOption.HasValue() ? cssOption.Value() : default;


그러나 default 리터럴은 이 경우 null인 유형의 기본값을 생성하기 위한 것입니다(CssUrl은 string 유형임).
또한 애플리케이션의 핵심 기능을 테스트하는 테스트도 작성했습니다. 텍스트를 입력하고 생성된 HTML 값이 예상 출력과 일치하는지 확인했습니다.
Pull request

이 경험을 통해 소프트웨어 테스팅과 그것이 소프트웨어 개발에 필수적인 이유에 대해 많은 것을 배웁니다. 앞으로는 프로젝트에 더 많은 테스트를 구현하고 다른 테스트 프레임워크를 탐색할 것입니다.

좋은 웹페이지 즐겨찾기