โจทย์ คือ มีฟังก์ชัน 2 ฟังก์ชันที่ทำหน้าที่เหมือนกัน คือ ถ้าใส่ Input เดียวกันก็จะได้ Output เดียวกัน ต้องการทดสอบว่าฟังก์ชันแรก เร็วกว่าอีกฟังก์ชันหรือไม่ โดยให้แสดงผลทดสอบพร้อมกับการรัน Unit test
ตัวอย่าง
public class Lib {
public static int ForSum(int x) {
var sum = 0;
for (int i = 0; i < x; i++) {
sum += i;
}
return sum;
} public static int LinqSum(int x) =>
Enumerable.Range(0, x).Sum();
}
ต้องการทดสอบว่าฟังก์ชัน ForSum เร็วกว่า LinqSum จริงหรือไม่ โดยให้แสดงด้วยว่าฟังก์ชันแรกเร็วกว่ากี่เปอร์เซ็นต์
สร้างโปรเจคและติดตั้ง Package
dotnet new xunit --language C# --ouptut src/SpeedTests
dotnet add src/SpeedTests/SpeedTests.csproj package Expecto
เขียน Unit Test
ให้เขียน Test แบบปกติ คือใช้ Attribute Fact ของ XUnit และทดสอบความเร็วด้วยฟังก์ชัน IsFasterThan ของ Expecto
using Xunit;
using System.Linq;
using Expecto.CSharp;
using Xunit.Abstractions;public class SpeedTest {
private readonly ITestOutputHelper output; public SpeedTest(ITestOutputHelper output) {
this.output = output;
} [Fact]
public void TestSum() {
var result =
Function.IsFasterThan(
() => Lib.ForSum(100),
() => Lib.LinqSum(100),
"For is faster than LINQ",
out var message
);
Assert.True(result, message);
output.WriteLine(message);
}
}
จากโค้ด ในบรรทัดสุดท้ายมีการใช้ ฟังก์ชัน WriteLine ของ ITestOutputHelper เนื่องจากต้องการให้แสดงผลเป็นเปอร์เซ็นต์ ออกมาด้วย
รัน Unit Test
dotnet test src/SpeedTests/SpeedTests.csproj
จะได้ผลลัพทธ์ ดังภาพ มีผลการรัน Unit test และความเร็วของทั้งสองฟังก์ชัน
สามารถโหลดโค้ดในตัวอย่างจากลิงก์นี้ SpeedTests