C#/WPF 애플리케이션에서 **데이터 기반 테스트(Data-Driven Testing, DDT)**를 구축하는 방법에 대해 자세히 알아보겠습니다. 데이터 기반 테스트는 다양한 테스트 데이터를 기반으로 자동화된 테스트 케이스를 생성해, 코드의 다양한 시나리오를 효율적으로 검증하는데 유용한 기법입니다. 특히 입력과 출력이 다양한 상황에서 테스트해야 하는 경우, 수작업 없이 자동으로 모든 경우의 수를 테스트할 수 있습니다.
데이터 기반 테스트(DDT)란?
DDT는 외부 데이터 소스를 통해 여러 테스트 데이터를 제공하여 동일한 테스트 로직을 다양한 조건 하에서 반복 실행할 수 있게 하는 테스트 방식입니다. 이를 통해 코드의 로직을 검증할 때 테스트 케이스를 효율적으로 관리하고 실행할 수 있으며, 데이터가 추가되더라도 코드를 변경할 필요 없이 새로운 테스트 케이스를 생성할 수 있는 유연함을 제공합니다.
WPF 애플리케이션에서 DDT 구축하기
여기에서는 NUnit 프레임워크와 간단한 CSV 파일을 활용해 WPF 애플리케이션의 로그인 기능을 테스트하는 예제를 다뤄보겠습니다.
1. 데이터 소스 준비하기
테스트할 데이터를 CSV 파일에 저장하여 다양한 입력 시나리오를 설정합니다. 이 데이터는 각 테스트 케이스에 필요한 정보(예: 사용자명, 비밀번호, 예상 결과)를 포함하고 있으며, 외부 데이터 소스에 저장되기 때문에 코드 수정 없이도 데이터 변경을 통해 손쉽게 테스트 시나리오를 확장할 수 있습니다.
username,password,expectedResult
user1,pass1,Success
user2,wrongpass,Fail
user3,pass3,Success
샘플데이터 : testData.csv
2. NUnit 테스트 프레임워크 준비하기
C#에서 NUnit은 다양한 데이터 기반 테스트 기능을 제공하는 프레임워크로, TestCaseSource를 통해 외부 데이터를 로드하고 테스트에 활용할 수 있습니다. 이 예제에서는 CSV 파일에서 데이터를 읽어 각 데이터 셋에 대해 반복적으로 로그인 기능을 테스트할 것입니다.
3. 데이터 로더 작성하기
먼저, CSV 파일의 데이터를 읽어와 IEnumerable 형식으로 반환하는 유틸리티 메서드를 작성합니다. 이 메서드를 통해 데이터 소스의 내용을 로드하여 테스트에 전달합니다.
using System.Collections.Generic;
using System.IO;
public class TestDataLoader
{
public static IEnumerable<object[]> LoadCsv(string filePath)
{
var lines = File.ReadAllLines(filePath);
foreach (var line in lines)
{
var columns = line.Split(',');
yield return new object[] { columns[0], columns[1], columns[2] };
}
}
}
위 코드에서 LoadCsv 메서드는 CSV 파일을 읽고 각 줄을 쉼표로 분리하여 object[] 배열로 반환합니다. 이를 통해 테스트 메서드에 데이터를 제공할 수 있습니다.
4. 데이터 기반 테스트 작성하기
이제 TestDataLoader의 데이터를 활용하여 실제 테스트 메서드를 작성해 보겠습니다. 각 테스트 케이스는 TestDataLoader에서 제공한 데이터를 기반으로 실행됩니다. TestCaseSource를 통해 데이터 로딩 메서드를 지정하여, 로그인 기능을 자동으로 다양한 입력에 대해 테스트할 수 있습니다.
using NUnit.Framework;
[TestFixture]
public class LoginTests
{
[Test, TestCaseSource(typeof(TestDataLoader), nameof(TestDataLoader.LoadCsv), new object[] { "path/to/testData.csv" })]
public void TestLogin(string username, string password, string expectedResult)
{
// 1. WPF 애플리케이션의 로그인 로직을 포함한 서비스 인스턴스 생성
var loginService = new LoginService(); // 로그인 로직을 담당하는 서비스 예시
// 2. 로그인 기능 실행
var result = loginService.Authenticate(username, password);
// 3. 결과 검증 - 기대값과 비교
Assert.AreEqual(expectedResult, result);
}
}
코드 설명
- 로그인 서비스 호출: loginService.Authenticate(username, password) 메서드를 호출하여 로그인 로직을 수행합니다.
- 결과 검증: 예상 결과(expectedResult)와 실제 로그인 결과를 비교하여 테스트를 검증합니다.
- 반복 실행: TestCaseSource를 통해 데이터 소스에서 불러온 각 행마다 TestLogin 메서드가 자동으로 실행됩니다.
5. UI 요소와 함께 테스트하기 (옵션)
만약 WPF 애플리케이션의 UI 요소를 포함하여 데이터 기반 테스트를 실행하고자 한다면, Appium이나 WinAppDriver와 같은 도구를 추가로 사용해 UI 자동화 테스트를 설정할 수 있습니다. 다음은 UI 요소를 사용한 데이터 기반 테스트 예제입니다.
using NUnit.Framework;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Windows;
[TestFixture]
public class LoginUITests
{
private WindowsDriver<WindowsElement> _session;
[OneTimeSetUp]
public void SetUp()
{
var appOptions = new AppiumOptions();
appOptions.AddAdditionalCapability("app", "YourApp.exe");
_session = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), appOptions);
}
[Test, TestCaseSource(typeof(TestDataLoader), nameof(TestDataLoader.LoadCsv), new object[] { "path/to/testData.csv" })]
public void TestLoginUI(string username, string password, string expectedResult)
{
// 1. 입력 필드와 버튼 찾기
var usernameField = _session.FindElementByAccessibilityId("UsernameFieldId");
var passwordField = _session.FindElementByAccessibilityId("PasswordFieldId");
var loginButton = _session.FindElementByAccessibilityId("LoginButtonId");
// 2. 입력 및 버튼 클릭
usernameField.Clear();
usernameField.SendKeys(username);
passwordField.Clear();
passwordField.SendKeys(password);
loginButton.Click();
// 3. 결과 확인
var resultMessage = _session.FindElementByAccessibilityId("ResultMessageId").Text;
Assert.AreEqual(expectedResult, resultMessage);
}
[OneTimeTearDown]
public void TearDown()
{
_session.Quit();
}
}
코드 설명
- WPF 애플리케이션 실행: AppiumOptions를 사용하여 WPF 애플리케이션을 설정합니다.
- UI 요소 찾기 및 값 입력: 각 데이터 셋을 기반으로 사용자명과 비밀번호를 입력한 후 로그인 버튼을 클릭합니다.
- 결과 검증: 로그인 성공 여부를 UI 요소를 통해 확인하고, 예상 결과와 비교하여 검증합니다.
결론
이처럼 데이터 기반 테스트는 WPF 애플리케이션에서 다양한 입력 시나리오에 대해 반복적인 테스트를 자동화할 수 있도록 해줍니다. DDT는 코드 품질을 높이고 유지보수를 쉽게 만들어 줄 뿐만 아니라, 향후 새로운 테스트 케이스가 추가될 때도 쉽게 확장 가능합니다. UI 자동화 테스트까지 도입하면 사용자가 실제로 보는 화면을 기반으로 기능을 확인할 수 있어 더욱 완성도 높은 테스트를 구축할 수 있습니다.
'C#' 카테고리의 다른 글
C#으로 비동기 프로그래밍 이해하기 (0) | 2024.10.28 |
---|---|
C#에서 Dependency Injection (의존성 주입) 이해하기 (0) | 2024.10.27 |
C#으로 간단한 로깅 시스템 구축하기 (3) | 2024.10.27 |
C#으로 간단한 메모장 애플리케이션 만들기 (0) | 2024.09.17 |
C#으로 파일 시스템 감시 프로그램 만들기 (0) | 2024.09.16 |