Basit Bir Test Framework Geliştirelim 10
2023-05-11
Genellikle bir test framework’ünde “Parameterized Tests” veya “Data-Driven Tests” adı verilen bir özellik kullanılır. Bu özellik, bir test metodunun farklı veri setleriyle birden çok kez çalıştırılmasını sağlar. Bizde bu özelliği ekleyelim.
Aşağıda, TestCase
adında bir attribute ve TestRunner
‘da bu attribute’u işleyecek kodu tanımlayalım, bu sayede TestRunner
ıda refactor edelim.
using System;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
// ...
public class TestCaseAttribute : Attribute
{
public object[] Parameters { get; }
public TestCaseAttribute(params object[] parameters)
{
Parameters = parameters;
}
}
public static class TestRunner
{
public static async Task RunTestsAsync<T>()
{
var testClassInstance = Activator.CreateInstance<T>();
var testMethods = typeof(T)
.GetMethods()
.Where(m => m.GetCustomAttributes<TestAttribute>().Any())
.ToList();
foreach (var testMethod in testMethods)
{
var testCaseAttributes = testMethod.GetCustomAttributes<TestCaseAttribute>();
if (!testCaseAttributes.Any())
{
await RunTestMethodAsync(testClassInstance, testMethod);
}
else
{
foreach (var testCase in testCaseAttributes)
{
await RunTestMethodAsync(testClassInstance, testMethod, testCase.Parameters);
}
}
}
}
private static async Task RunTestMethodAsync<T>(T testClassInstance, MethodInfo testMethod, object[] parameters = null)
{
try
{
// Test metodunu çalıştır ve sonucu bekler
if (parameters == null)
{
await (Task)testMethod.Invoke(testClassInstance, null);
}
else
{
await (Task)testMethod.Invoke(testClassInstance, parameters);
}
// Test başarılı oldu
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"{testMethod.Name} PASSED");
}
catch (Exception ex)
{
// Test bir hata nedeniyle başarısız oldu
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"{testMethod.Name} FAILED");
// Exception, bir AssertFailedException ise, hata mesajını yazdır
if (ex.InnerException is AssertFailedException assertFailedException)
{
Console.WriteLine(assertFailedException.Message);
}
else
{
// Diğer hataları da yazdır
Console.WriteLine(ex.InnerException);
}
}
finally
{
// Konsol rengini normal rengine döndür
Console.ResetColor();
}
}
}
Bu kod, TestRunner
‘ın test metotlarını bulurken TestCaseAttribute
‘ları aramasını ve bulduğu her bir TestCaseAttribute
için test metodunu çalıştırmasını sağlar. Her bir TestCaseAttribute
‘un parametreleri, test metoduna argüman olarak verilir. Bu sayede, bir test metodunu farklı parametrelerle birden çok kez çalıştırabilirsiniz.