이전 글에서 GitHub Copilot을 사용한 코드 작성에 대해 살펴보았습니다. 본 글에서는 기존 코드에 GitHub Copilot을 활용하여 단위 테스트를 생성하고 실행하는 방법을 알아보겠습니다.
코드 배경 설명
다양한 단위 변환 기능을 제공하는 도구 클래스가 필요했습니다. 예를 들어 다음과 같은 변환 기능이 필요했습니다:
- 길이 값을 인치로 변환
- 길이 값을 마일로 변환
- 길이 값을 센티미터로 변환
- 길이 값을 킬로미터로 변환
- 무게 값을 그램으로 변환
- 무게 값을 킬로그램으로 변환
- 전력 값을 와트로 변환
- 전류 값을 암페어로 변환
- 전압 값을 볼트로 변환
이러한 기능은 간단하고 명확해야 했습니다. 외부 라이브러리(https://digidemic.github.io/UnitOf/)를 사용할 수도 있었지만, 너무 무거워서 GitHub Copilot을 직접 사용하여 코드를 구현하기로 결정했습니다.
GitHub Copilot을 사용한 코드 생성
먼저 Prompt를 잘 구성하는 것이 중요합니다. 좋은 Prompt는 작업 효율을 크게 높여주지만, 여러 번의 시도가 필요합니다. 여기서 Prompt 설계 방식을 공유합니다:
1. 열거형 클래스 생성
Prompt: C#을 사용하여 LengthUnit 열거형 클래스를 생성하세요. 일반적인 길이 단위를 포함해야 합니다.
Prompt: C#을 사용하여 WeightUnit 열거형 클래스를 생성하세요. 일반적인 무게 단위를 포함하고, 중국어 주석을 추가하세요. 표준 주석 형식을 사용하세요.
Prompt: C#을 사용하여 PowerUnit 열거형 클래스를 생성하세요. 일반적인 전력 단위를 포함하고, 중국어 주석을 추가하세요. 표준 주석 형식을 사용하세요.
Prompt: C#을 사용하여 CurrentUnit 열거형 클래스를 생성하세요. 일반적인 전류 단위를 포함하고, 중국어 주석을 추가하세요. 표준 주석 형식을 사용하세요.
Prompt: C#을 사용하여 VoltageUnit 열거형 클래스를 생성하세요. 일반적인 전압 단위를 포함하고, 중국어 주석을 추가하세요. 표준 주석 형식을 사용하세요.
2. 단위 변환 서비스 구현 클래스 생성
다음 Prompt는 여러 번 수정을 거쳐 만들어졌습니다:
Prompt: C#을 사용하여 단위 변환 서비스를 제공하는 UnitConversionService 클래스를 생성하세요. 다음 메서드를 구현해야 합니다: 길이 값을 인치로 변환, 길이 값을 피트로 변환, 길이 값을 마일로 변환, 길이 값을 센티미터로 변환, 길이 값을 킬로미터로 변환, 무게 값을 그램으로 변환, 무게 값을 킬로그램으로 변환, 전력 값을 와트로 변환, 전류 값을 암페어로 변환, 전압 값을 볼트로 변환. 예를 들어, 길이 값을 인치로 변환하는 메서드는 public double ConvertToInch(double value, LengthUnit lengthUnit)로 구현하고, LengthUnit 변수를 사용하여 길이 변환을 수행해야 합니다. 메서드에 표준 주석을 추가하고, 중국어 주석을 사용하세요.
생성된 코드:
public class UnitConversionService
{
/// <summary>
/// 길이 값을 인치로 변환
/// </summary>
public double ConvertToInch(double value, LengthUnit lengthUnit)
{
switch (lengthUnit)
{
case LengthUnit.Meter:
return value * 39.3701;
case LengthUnit.Centimeter:
return value * 0.393701;
case LengthUnit.Kilometer:
return value * 39370.1;
case LengthUnit.Mile:
return value * 63360;
case LengthUnit.Foot:
return value * 12;
case LengthUnit.Yard:
return value * 36;
default:
throw new NotSupportedException("지원되지 않는 길이 단위입니다.");
}
}
/// <summary>
/// 길이 값을 피트로 변환
/// </summary>
public double ConvertToFoot(double value, LengthUnit unit)
{
// 변환 로직
}
/// <summary>
/// 길이 값을 마일로 변환
/// </summary>
public double ConvertToMile(double value, LengthUnit unit)
{
// 변환 로직
}
// 다른 메서드들...
}
다른 메서드들은 구현되지 않았으므로, 다음과 같은 Prompt로 GitHub Copilot에게 계속 코드 생성을 요청해야 합니다:
Prompt: UnitConversionService 클래스에서 ConvertToInch 메서드의 구현 방식과 주석 요구 사항을 참조하여, ConvertToMile, ConvertToFoot, ConvertToCentimeter, ConvertToKilometer, ConvertToGram, ConvertToKilogram, ConvertToWatt, ConvertToAmpere, ConvertToVolt 메서드의 구체적인 변환 로직을 생성하세요. 각 메서드에 코드 구현을 포함해야 합니다.
GitHub Copilot이 생성한 코드는 항상 완벽하지 않으므로, 코드 검증이 매우 중요합니다. 다음은 검증 후 수정된 코드입니다:
/// <summary>
/// 단위 변환 서비스 구현 클래스
/// </summary>
public class UnitConversionService : IUnitConversionService
{
/// <summary>
/// 길이 값을 인치로 변환
/// </summary>
public double ConvertToInch(double value, LengthUnit lengthUnit)
{
switch (lengthUnit)
{
case LengthUnit.Inch:
return value;
case LengthUnit.Meter:
return value * 39.3701;
case LengthUnit.Centimeter:
return value * 0.393701;
case LengthUnit.Kilometer:
return value * 39370.1;
case LengthUnit.Mile:
return value * 63360;
case LengthUnit.Foot:
return value * 12;
case LengthUnit.Yard:
return value * 36;
default:
throw new NotSupportedException($"지원되지 않는 길이 단위: {lengthUnit}");
}
}
// 다른 변환 메서드들...
}
3. 단위 테스트 코드 생성
먼저 전체 클래스를 선택한 다음, 다음 Prompt를 입력합니다:
Prompt: @workspace /tests 선택된 코드에 대해 MSTest 단위 테스트 프레임워크를 사용하여 단위 테스트 코드를 생성하세요. 각 메서드에 대한 단위 테스트를 구현해야 합니다.
GitHub Copilot은 한 번에 하나의 메서드에 대한 테스트만 생성하므로, 다음과 같은 Prompt로 다른 메서드에 대한 테스트를 계속 생성해야 합니다:
Prompt: 다른 메서드에 대해 유사한 테스트를 반복하세요: ConvertToMile, ConvertToFoot, ConvertToCentimeter, ConvertToKilometer, ConvertToGram, ConvertToKilogram, ConvertToWatt, ConvertToAmpere, ConvertToVolt
최종 생성된 단위 테스트 코드:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using T.Core.i10n.Service;
using T.Core.i10n.SPI;
namespace T.Core.i10n.Service.Tests
{
[TestClass]
public class UnitConversionServiceTests
{
private UnitConversionService? _unitConversionService;
[TestInitialize]
public void Setup()
{
_unitConversionService = new UnitConversionService();
}
[TestMethod]
public void ConvertToInch_ShouldConvertCorrectly()
{
var result = _unitConversionService!.ConvertToInch(1, LengthUnit.Meter);
Microsoft.VisualStudio.TestTools.UnitTesting.Assert.AreEqual(39.3701, result, 0.0001);
}
[TestMethod]
[ExpectedException(typeof(NotSupportedException))]
public void ConvertToInch_ShouldThrowExceptionForUnsupportedUnit()
{
_unitConversionService!.ConvertToInch(1, (LengthUnit)999);
}
// 다른 테스트 메서드들...
}
}
위의 단위 테스트 코드는 VS Code에서 마우스 오른쪽 버튼을 클릭하고 "Run Test"를 선택하여 실행할 수 있습니다.