มาใช้ Should Assertion Library เขียน UnitTest กันเถอะ… Action!

Should Assertion มันคืออะไร

Should Assertion มันก็คือ library แบบเปิดเผย code ที่ถูกสร้างขึ้นมาในรูปแบบ extension สำหรับ .NET เพื่อใช้เขียน code สำหรับ unit-test ในส่วนของ logic เพื่อยืนยัน หรือตรวจสอบความถูกต้อง(assert หรือ verify) ตามเรื่องราว(story) โดยจะเขียนด้วยโคดโปรแกรมสำหรับ .NET ในสไตล์เท่ๆแบบ AAA(Arrange, Act, Assert) และ BDD นั่นเองยังไงละครับ เจ้า Should ตัวนี้มันได้จัดเตรียม extension ไว้ครบเลยครับ เพื่อให้เราเขียน code ให้อ่านง่ายๆ หรือเป็นธรรมชาติไหลลื่น(fluently)ในตอนที่ต้อง assertion เพื่อตรวจสอบความถูกต้องใน unit test ได้หนะครับ จะให้เข้าใจกันง่ายๆ ก็ต้องลงมือทำกันเลยดีกว่า

เริ่มต้น install Should Assertion ง่ายๆโดยใช้ NuGet

1. เปิด VS 2010 Studio ครับ(หวังว่าคงจะมีอยู่ในเครื่องคุณอยู่แล้วนะครับ) ต่อจากนั้นให้สร้าง Test Projects อันหนึ่ง ตั้งชื่ออะไรก็ได้

2. ไปที่ Menu Bar บนสุดครับ เลือก Tools -> Library Packet Manager -> Packet Manager Console ดูตามภาพเลยครับ (มีไม่เหมือนผมให้ไปที่ NuGet แล้ว install ก่อนครับ)

3. ไปที่ Packet Manager Console ที่อยู่ล่างสุด พิมพ์ install-package should ลงไป กด enter รอสักแป๊ปนึง… เสร็จเรียบร้อยแล้วจะขึ้นตามภาพแบบนี้

เอาละขั้นตอนต่อไปก็ลองเขียน unit test กันเร้ย

เขียน assertion Test ด้วย Should… Action!

1. เอา Should library เข้ามาใน class UnitTest1 ของเราก่อนครับ

using Should;

2. บรรเลงเขียน code C# เพื่อทดสอบลงไปบน Test Method ของเรา ตัวอย่างนี้ผมเขียน code เพื่อตรวจสอบค่า object, boolean, string และ collection ง่ายๆครับ ตามนี้

[TestMethod]
public void TestMethod1()
{

object obj = null;
obj.ShouldBeNull();

obj = new object();
obj.ShouldBeType(typeof(object));
obj.ShouldEqual(obj);
obj.ShouldNotBeNull();
obj.ShouldNotBeSameAs(new object());
obj.ShouldNotBeType(typeof(string));
obj.ShouldNotEqual(“foo”);

obj = “x”;
obj.ShouldNotBeInRange(“y”, “z”);
obj.ShouldBeInRange(“a”, “z”);
obj.ShouldBeSameAs(“x”);

“This String”.ShouldContain(“This”);
“This String”.ShouldNotBeEmpty();
“This String”.ShouldNotContain(“foobar”);

false.ShouldBeFalse();
true.ShouldBeTrue();

var list = new List<object>();
list.ShouldBeEmpty();
list.ShouldNotContain(new object());

var item = new object();
list.Add(item);
list.ShouldNotBeEmpty();
list.ShouldContain(item);

}

จบแล้วครับเขียน assertion แบบธรรมดาๆ ต่อไปจะเขียน unit-test ในแบบให้อ่านง่ายๆเป็นภาษาที่ธรรมชาติมากขึ้นนะครับ โดยก่อนอื่นให้คุณ install packet ShouldFluent เพิ่มเข้ามาอีกหน่อยนึงครับ ให้ไปที่ Packet Manager Console ครับแล้วพิมพ์ install-package ShouldFluent ลงไปกด enter รอมัน load library และ add reference เข้า projects ของเราสักแป๊ปนึง… เสร็จแล้วจะแสดงเหมือนภาพของผม แบบนี้ครับ

หลังจาก install ShouldFluent library เสร็จแล้วก็ using packet เข้ามาใช้กันได้เลย ตามนี้

using Should.Fluent;

เอาละทีนี้ก็ลองเปลี่ยนไปเขียน code ในแบบลื่นไหลเป็นธรรมชาติกันได้แล้วครับ หน้าตา code ก็จะออกมาแบบนี้

[TestMethod]
public void TestMethod2()
{

object obj = null;
obj.Should().Be.Null();

obj = new object();
obj.Should().Be.OfType(typeof(object));
obj.Should().Equal(obj);
obj.Should().Not.Be.Null();
obj.Should().Not.Be.SameAs(new object());
obj.Should().Not.Be.OfType<string>();
obj.Should().Not.Equal(“foo”);

obj = “x”;
obj.Should().Not.Be.InRange(“y”, “z”);
obj.Should().Be.InRange(“a”, “z”);
obj.Should().Be.SameAs(“x”);

“This String”.Should().Contain(“This”);
“This String”.Should().Not.Be.Empty();
“This String”.Should().Not.Contain(“foobar”);

false.Should().Be.False();
true.Should().Be.True();

var list = new List<object>();
list.Should().Count.Zero();
list.Should().Not.Contain.Item(new object());

var item = new object();
list.Add(item);
list.Should().Not.Be.Empty();
list.Should().Contain.Item(item);

}

และนี่ก็เป็น code ตัวอย่างที่เขียนในแบบอ่านเป็นธรรมชาติอีกอันนึงครับ

[TestMethod]
public void TestMethod3()
{

var numbers = new List<int> { 1, 1, 2, 3 };
numbers.Should().Contain.Any(x => x == 1);
numbers
.Should().Count.AtLeast(1)
.Should().Count.NoMoreThan(5)
.Should().Count.Exactly(4)
.Should().Contain.One(x => x > 2);

var id = new Guid();
id.Should().Be.Empty();

id = Guid.NewGuid();
id.Should().Not.Be.Empty();

var date = DateTime.Now;
date.Should().Be.Today();

var str = “”;
str.Should().Be.NullOrEmpty();

var one = “1”;
one.Should().Be.ConvertableTo<int>();

var idString = Guid.NewGuid().ToString();
idString.Should().Be.ConvertableTo<Guid>();

}

จบแล้วละครับ สำหรับบทความ มาใช้ Should Assertion Library เขียน UnitTest กันเถอะ… Action! ก็พอเข้าใจกันนะครับ ซึ่งผมรู้สึกว่าการที่ผมเอา Should Library นี้มาใช้เขียน unit test แล้วมันทำให้ผมอ่าน code ง่ายกว่าแบบใช้ Assert แบบธรรมดาที่มีไว้ให้อยู่แล้วเยอะเลย ถึงได้เขียนเป็นไกด์เริ่มต้นให้อ่านกัน มีปัญหาอะไรก็เมล์ๆมาคุยกันได้นะครับ …

ขอขอบคุณ: Should Assertion Library

ขอบคุณครับ

#:P

“… ให้รักษาศิล 5, ฝึกวิปัสสนา-กรรมฐาน และหมั่นทำบุญ ทุกวัน

ความร่ำรวย เงินทอง และความสุข ก็จะมาหาเจ้าเอง…”

— หลวงพ่อชํานาญ วัดบางกุฎีทอง —

Advertisements

#c, #unit-test