티스토리 뷰
이번 시간에는 저번 포스팅에 이어서 MakeConst 튜토리얼을 더 진행해 보겠습니다.
저번 포스팅 링크는 아래와 같습니다.
https://mathmakeworld.tistory.com/103
이번 포스팅에서는 Unit Test를 통해서 빠르게 원하는 기능을 테스트하는 코드를 만들어 보겠습니다.
Unit Test
솔루션에 존재하는 프로젝트 중 MakeConst.Test를 열고 내부의 MakeConstUnitTests.cs 파일을 엽니다.
그후 아래 이미지와 같이 MakeConstUnitTest 클래스 내부에 함수들을 만들면 Unit Test를 할 수 있습니다.

Unit Test를 돌리려면 함수를 작성할 때 TestMethod라는 Attribute를 붙이면 됩니다.
Test를 하는 함수로는 총 2가지가 있습니다.
각각은 LocalIntCouldBeConstant_Diagnostic에서 호출하게 될 VerifyCS.VerifyCodeFixAsnyc와
VariableIsAssigned_NoDiagnostic에서 호출하게 될 VerifyCS.VerifyCodeFixAsync입니다.
각각에 대해서 알아보겠습니다.
VerifyCS.VerifyCodeFixAsnyc

VerifyCS.VerifyCodeFixAsync 함수는 코드를 제대로 수정해내는지 확인하는 Test입니다.
VerifyCS.VerifyCodeFixAsync 함수는 2개의 인자를 받는데,
첫 번째 인자는 수정하기 전 코드이고 두 번째 인자는 수정한 후의 바뀌게 될 코드입니다.
첫 번째 인자로 주어진 코드가 위에서 작성한 Roslyn 로직을 통해 제대로 수정되어서
두 번째 인자로 주어진 코드와 같아지면 Test를 통과하게 됩니다.
VerifyCS.VerifyCodeFixAsync

VerifyCS.VerifyAnalyzerAsnyc 함수는 Diagnostic을 발생시키면 안되는 상황에서
정말 발생을 안 시켰는지 확인하는 Test입니다.
VerifyCS.VerifyAnalyzerAsync 함수는 1개를 인자로 받고
해당 상황에서 Diagnostic을 발생시키지 않으면 통과하게 됩니다.
코드 작성을 끝내고 아래와 같이 솔루션에서 마우스 오른쪽 버튼을 눌러 테스트 실행을 누릅니다.

테스트가 끝나면 새로 창이 뜨고 테스트 결과가 나옵니다.
위 코드들은 의도대로 동작했기 때문에 모두 테스트를 통과하게 됩니다.
일단 간단한 예제에 대해서는 정상적으로 잘 동작하는 것을 확인하였으나 아직 수정을 해야하는 부분들이 있습니다.
각각을 살펴보면
- 변수 선언이 한 줄에 여러 개가 있을 때 제대로 동작하지 않습니다,
예를 들어 int a = 10, b = 22; 라고 선언을 한 줄에 여러 개 할 수 있는데,
이럴 경우에 첫번째 변수만 판단하도록 되어 있기 때문입니다. - 변수 선언 부에 이니셜라이져가 있는지 여부를 판단하지 않습니다.
- 변수 선언 부의 이니셜라이저가 컴파일 타임 상수인지를 판단하지 않습니다.
이 3가지입니다.
이런 것들을 판단하지 않기 때문에 아래 2개의 테스트를 추가하면 통과하지 못하게 됩니다.


이 2개의 테스트를 통과할 수 있도록 코드를 수정해야 합니다.
먼저 기존 코드를 봅시다.
MakeConstAnalyzer.cs의 AnalyzeNode 함수 내부입니다.

코드를 자세히 보시면 localDeclaration.Declaration.Variables.Single()에서
이미 해당 Declaration의 variable이 하나라는 가정을 하고 있습니다.
바로 이 부분 때문에 MultipleVariable_NoDiagnostic 테스트는 제대로 실행되지 못하고 실패하게 됩니다.
또한 윗 부분은 단순히 선언 외의 부분에서 할당이 있는지 확인할 뿐
할당하는 변수가 컴파일 타임 상수인지 확인하는 부분이 없습니다.
따라서 위에서 설명한 InitializerIsNotConstant_NoDiagnostic 테스트의 int i = DateTime.Now.DayOfYear; 에서 const를 추가하도록 리포팅하지 않아야함에도 불구하고 리포팅을 하기 때문에 테스트를 실패하게 됩니다.
위에서 확인한 내용을 아래와 같이 수정하면 테스트들을 잘 통과할 수 있습니다.

간단하게 살펴보면
- 기존에는 localDeclaration.Declaration에서 하나의 변수만 보던 것을 foreach를 통해 모든 변수를 확인하도록 수정했습니다.
- foreach를 돌면서 모든 변수에 대해서 initializer가 있는지, 또 initializer가 컴파일 타임 상수인지 확인하도록 했습니다.
- foreach를 돌면서 모든 변수에 대해서 선언 외의 부분에서 할당이 있는지 확인하고 있습니다.
이 3가지 정도입니다.
하지만 이 덕분에 여러 개의 변수 선언일때 로직이 망가지거나, 상수가 initializer 할당으로 인해 잘못된 리포팅을 하는 경우가 없어졌습니다.
Unit Test를 돌려보면 아래와 같이 모두 초록불이 뜬 것을 볼 수 있습니다.

이로써 로슬린 MakeConstant 튜토리얼을 간단하게 살펴봤습니다.
지금까지 알아본 내용은 로슬린의 매우 일부분이지만 전체적인 흐름을 파악하는데는 도움이 되었다고 생각합니다.
앞으로 기회가 된다면 로슬린 내용을 가지고 포스팅하도록 하겠습니다.
'프로그래밍' 카테고리의 다른 글
DirectX12를 활용한 PostProcessing (0) | 2024.12.28 |
---|---|
C#의 Thread, ThreadPool 및 Task (0) | 2022.03.11 |
C#의 StackTrace (0) | 2021.08.27 |
로슬린 MakeConst 튜토리얼 (1/2) (0) | 2021.08.27 |
C#의 Reflection (0) | 2021.02.27 |
- Total
- Today
- Yesterday
- Transformation
- DirectX12
- MeshProcessing
- 값 형식
- Scriptable Render Pipeline
- 루빅스큐브
- RL
- 최적화
- Unity
- collision detection
- 강화학습
- Unreal
- C#
- CollisionDetection
- Mesh
- normalized device coordinate
- Mesh Processing
- reference type
- transform
- VTK
- perspective projection
- SRP
- Bounding Volume Hierarchy
- value type
- 참조 형식
- RubiksCube
- opengl
- 유니티
- AABB
- NDC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |