Tag: testing

  • เขียน Unit test ทดสอบการทำงานกับฐานข้อมูลที่ใช้ Entity Framework Core

    ในบทความนี้ จะนำเสนอการเขียน unit test เพื่อทดสอบการทำงานของ method ที่ใช้งาน Entity Framework Core ซึ่งตัว Entity Framework Core มาพร้อมความสามารถที่สามารถใช้งาน in-memory store ซึ่งสามารถใช้ในการทดสอบได้ หรือจะใช้ mock framework ในการทดสอบก็ได้ โดยในบทความนี้จะแสดงให้เห็นทั้งสองแนวทาง

    In Memory Database

    In Memory Database เป็นการสร้าง database จำลองขึ้นมาใช้บน memory แทนที่การใช้ database ตัวจริง ทำให้เราสามาถเขียน unit test โดยที่ไม่ไปกระทบกับ database จริงๆ โดยการเพิ่ม Microsoft.Entityframework.InMemory NuGet package เข้าไปใน test projet

    ในส่วนของ DbContext class จะต้องมี constructor ที่รับ DbContectOption เป็น parameter

    var options = new DbContextOptionsBuilder<MyDbContext>()
                    .UseInMemoryDatabase(Guid.NewGuid().ToString("N")).Options;
    
    var dbContext = new MyDbContext(options);

    จากตัวอย่างด้านบน เราใช้ UseInMemoryDatabase extension method -ของ DbContextOptionsBuilder ซึ่งรับ parameter 1 ตัวเพื่อกำหนดชื่อของ database โดยเราจะใช้ Guid จากนั้นก็สามารถเขียน unit test ได้ดังนี้

    [TestClass]
    public class MyRepositoryTest
    {
            private MyDbContext CreateDbContext()
            {
                var options = new DbContextOptionsBuilder<MyDbContext>()
                    .UseInMemoryDatabase(Guid.NewGuid().ToString("N")).Options;
    
                var dbContext = new MyDbContext(options);
                return dbContext;
            }
    
           
            [TestMethod]
            public void It_should_add_a_product_successfully()
            {
                //Arrange
                var dbContext = CreateDbContext();
                var rep = new MyRepository(dbContext);
                var product = new Product 
                { 
                   ProductName="Toyota Altis",
                   UnitPrice=900000 
                };
    
                //Act
                var result = rep.Add(product);
               
                //Assert
                Assert.IsTrue(result.ProductID > 0);
    
                //Clean up
                dbContext.Dispose();
            }
    
            [TestMethod]
            public void It_should_update_a_product_successfully()
            {
                //Arrange
                var expected = 950000;
                var dbContext = CreateDbContext();
                var rep = new MyRepository(dbContext);
                var product = new Product 
                { 
                   ProductName="Toyota Altis",
                   UnitPrice=900000 
                };
    
                //Act
                var result = rep.Add(product);
                result.UnitPrice = expected;
                rep.Update(result);
                result = dbContext.Products.First(p=>p.ProductID == result.ProductID);
    
                //Assert
                Assert.AreEqual(expected,result.UnitPrice);
    
                //Clean up
                dbContext.Dispose();
            }
    
            [TestMethod]
            public void It_should_remove_a_product_successfully()
            {
                //Arrange
                var dbContext = CreateDbContext();
                var rep = new MyRepository(dbContext);
                var product = new Product 
                { 
                   ProductName="Toyota Altis",
                   UnitPrice=900000 
                };
    
                //Act
                var result = rep.Add(product);
                rep.Delete(result.ProductID);
                var isExists = dbContext.Products.Any(p => p.ProductID == result.ProductID);
    
                //Assert
                Assert.IsFalse(isExists);
    
                //Clean up
                dbContext.Dispose();
            }
    
        }

    จากตัวอย่างด้านบน CreateDbContext method ทำหน้าที่ในการสร้าง DbContext object ที่ทำงานกับ in-memory database แทนที่จะใช้งาน database ตัวจริง หลังจากนั้นก็สามารถทำตามที่ต้องการได้ เหมือนกับการใช้งาน DbContext ปกติ

    Using Mock Frameworks

    อีกทางเลือกหนึ่ง เราสามารถใช้ mock frameworks ในการเขียน unit tests ซึ่งเราจะใช้ Moq mock frameworks ซึ่งเป็น mock frameworks ที่ได้รับความนิยมสำหรับ .Net platform โดยก่อนที่จะเริ่มเขียน unit test เราจะต้องกำหนดให้ DbSet pproperty ของ DbContext เป็น virtual ซึงจะทำให้ Moq framework สามารถสร้าง fake object และ override property นี้ได้ และดำเนินการดังนี้

    1. สร้าง generic collection สำหรับ DbSet property แต่ละตัว
    2. Config fake DbSet ใน mock framework
    3. Setup และ forward DbSet property เหล่านั้นไปที่ generic collection
      • Provider
      • Expression
      • ElementType
      • GetEnumerator()
    [TestClass]
    public class MyRepositoryTest
    {
            private DbSet<T> CreateDbSet<T>(IQueryable<T> collection) where T:class
            {
                var stubDbSet = new Mock<DbSet<T>>();
                stubDbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(collection.Provider);
                stubDbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(collection.Expression);
                stubDbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(collection.ElementType);
                stubDbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(collection.GetEnumerator());
                return stubDbSet.Object;
            }
    
            [TestMethod]
            public void list_all_available_products_from_the_data_store()
            {
                //Arrange
                var expected = new List<Product>
                {
                    new Product {ProductName ="Toyota yaris"},
                    new Product {ProductName ="Toyota altis"},
                    new Product {ProductName ="Toyota camry"}
                };
    
                var productDbSet = CreateDbSet(expected.AsQueryable());
    
                var stubContext = new Mock<MyDbContext>();
                stubContext.Setup(o=>o.Products).Returns(productDbSet);
                var rep = new MyRepository(stubContext.Object);
    
                //Act
                var actual = (List<Product>)rep.GetAll();
    
                //Assert
                CollectionAssert.AreEquivalent(expected, actual);
    
            }
    
    
            [TestMethod]
            public void return_a_product_for_given_product_id()
            {
                //Arrange
                var expected = "Toyota altis";
                var expected = new List<Product>
                {
                    new Product {ProductName ="Toyota yaris"},
                    new Product {ProductName ="Toyota altis"},
                    new Product {ProductName ="Toyota camry"}
                };
    
                var productDbSet = CreateDbSet(collection.AsQueryable());
    
                var stubContext = new Mock<MyDbContext>();
                stubContext.Setup(o => o.Products).Returns(productDbSet);
                var rep = new MyRepository(stubContext.Object);
    
                //Act
                var actual = rep.GetById(2);
    
                //Assert
                Assert.AreEqual(expected, actual.ProductName);
    
            }        
        }

    อ้างอิง : https://www.bitiniyan.com/2019/02/02/how-to-write-unit-tests-with-entity-framework-core/

  • การทดสอบแบบอัตโนมัติ ด้วย Robot framework กับ Selenium Library (ตอนที่ 1 การติดตั้ง)

    วันนี้จะมาเล่าเรื่องการทดสอบแบบ Automate ด้วย Robot framework ค่ะ Robot framework ก็คือการทดสอบการทำงานของระบบที่สร้างขึ้น ให้ง่ายและรวดเร็วด้วยการทำ Automate Testing ซึ่งจุดขายของมันคือ Robot Framework สามารถ Test data , executes test cases ออกมาเป็น report และ logs ได้

    Robot Framework implement มาจาก ภาษา Python ดังนั้นเราก็ต้อง install Python กันก่อน โดย Dowloadที่ https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi  ติดตั้งง่าย ๆ มี Next คลิก Next 

    เมื่อติดตั้งเสร็จแล้วมาลองใช้คำสั่งใน Command line ดังรูป ถ้าได้ผลลัพธ์ดังรูปแสดงว่าเราติดตั้ง Python เรียบร้อยแล้วค่ะ

    ต่อไปก็ทำการ Download get-pip.py โดย Download ได้ที่ https://bootstrap.pypa.io/get-pip.py จากนั้นเปิด Command line ใช้คำสั่งเพื่อติดตั้ง pip เรียกจากที่ไฟล์เก็บอยู่ ดังรูป

    Set Environment Variables ไปที่ This PC คลิกขวา à Properties à Advanced system settings à Environment Variables คลิก New ดังรูป จากนั้นคลิกปุ่ม OK

    ที่ Path ทำการ Double click ขึ้นมา จากนั้น New เพิ่มดังรูป

    จากนั้นเปิด Command line พิมพ์คำสั่งเพื่อติดตั้งส่วน library ที่จำเป็นในการทดสอบ คำสั่งดังนี้

    เมื่อเราลงเสร็จ ลองใช้ คำสั่ง pip freeze จะเห็นว่า มันมี library ตามที่เราติดตั้ง ดังรูป

    Tools หรือ IDE ที่จะใช้ในการเขียน Robot Framework จะเลือกเอาตามที่ถนัดเลยค่ะ บทความครั้งหน้าเราจะมาลองใช้งานกันค่ะ

  • ทดสอบเว็บบน Browser ทุกตัวง่ายนิดเดียว

    ทดสอบเว็บผ่าน Browser
    หลังจากที่ได้มีการพัฒนาหรือสร้างเว็บขึ้นมาเรียบร้อยแล้วนั้น สิ่งแรกๆ ที่ต้องทำคือทดสอบเว็บของเราว่าสามารถที่จะแสดงผลผ่าน Browser ได้ดีหรือไม่ และแสดงผลได้ดีกับทุก Browser หรือไม่ เช่น Google Chrome , Firefox หรือจะเป็น Internet Explorer ซึ่ง Browser แต่ละตัวนั้นก็มีหลากหลายเวอร์ชันมาก และที่เราต้องพยายามทดสอบให้ได้มากที่สุดก็เพราะว่า เราไม่สามารถรู้ได้เลย ว่าลูกค้าหรือผู้ใช้เว็บของเรานั้นจะใช้เครื่องมือ หรือ Browser ตัวไหนเป็นหลัง ดังนั้นการทดสอบเว็บบน Browser ทุกตัวไม่ใช่เรื่องง่ายเลยจริงๆ

    ทำอย่างไรให้การทดสอบผ่าน Browser ทุกตัวเป็นเรื่องง่าย

    สำหรับครั้งนี้ผู้เขียนจะขอแนะนำเครื่องมือช่วยทดสอบการแสดงผลเว็บผ่าน Browser ทุกรุ่นทุกยี่ห้อ เพื่อให้เป็นเกร็ดความรู้เบื้องต้นเล็กๆ น้อยๆ เพื่อแก้ไขปัญหาการที่ต้องลงๆ ถอนๆ Browser ในเครื่องจนอาจจะปวดหัวเอาได้

    หลักๆ จากที่ศึกษาค้นคว้าเบื้องต้นพบว่าปัจจุบันมี Cloud Browser เปิดให้บริการมากมาย เช่น Saucelab, BrowserStack, Browserling, Ghostlab หรือ CrossBrowserTesting เป็นต้น

    สำหรับวันนี้จะขอนำเสนอหน้าตาของ BrowserStack กันก่อนละกัน

    • เราจะต้องสมัครสมาชิกกันก่อน โดยจะมีแบบ Free trial ให้เราทดลองใช้งาน สมัครเสร็จแล้วก็ Login เข้าไปทดลองใช้งานกันได้เลย

     

    • หลังจากสมัครสมาชิกทดลองใช้ฟรีกันเรียบร้อยแล้ว ก็จะพบกับหน้าตาของเจ้า BrowserStack แบบนี้

     

    • เราสามารถเลือกได้เลยว่าจะทดสอบเว็บกับระบบปฏิบัติการไน และ Browser อะไร

     

    • ตัวอย่างเช่นเลือก ระบบปฏิบัติการ Mac OS X Mavericks และ Browser Safari 7.1 ก็จะได้ตัวอย่างหน้าจอ
      แบบด้านล่าง

     

     

     

    • ในหน้าจอที่เรากำลังทดสอบก็จะมี Tool เล็กๆ ให้เราสามารถจัดการหน้าจอได้ เช่นสามารถ Switch เพื่อเปลี่ยนเป็นระบบปฏิบัติการ หรือ Browser อื่นๆ สามารถปรับ Resolutions
      ของหน้าจอได้ สามารถ Create a bug สามารถสร้าง Issue Tracker สามารถตั้งค่าอื่นๆ
      หรือตรวจสอบ Features ของตัว BrowserStack ได้ เป็นต้น

     

     

     

     

    สุดท้ายแล้วสำหรับเพื่อนๆ หรือใครที่มีปัญหายุ่งยากในการทดสอบเว็บให้ครบทุก Browser ก็สามารถลองเอาเจ้าตัว BrowserStack ไปใช้งานกันดู เผื่อบางทีอาจจะช่วยระยะเวลา หรือปัญหาต่างๆ ได้บ้างไม่มากก็น้อย ^ ^

    แหล่งความรู้อ้างอิง
    – http://soraya.in.th/2013/04/08/browserstack-ie/
    – https://medium.com/tag/browserstack
    – https://chittakorn.com/do-you-know/browser-testing/
    – http://www.designil.com/free-internet-explorer-mac.html

  • ใช้ Firebug ในการตรวจสอบข้อมูล

    วันนี้จะมาพูดถึง Firebug ซึ่งหลาย ๆ คนคงใช้งานหรือรู้จักกันอยู่แล้ว แต่ผู้เขียนเพียงแค่นำส่วนที่ใช้งานมาแบ่งปันสำหรับผู้ที่ยังไม่เคยใช้งานค่ะ

    Firebug เป็นเครื่องมือสำหรับ Web Development ในการแก้ไขตรวจสอบ JavaScript / CSS / HTML เป็น Extension หรือ Add-ons สำหรับใช้ในการช่วยจัดการ Debug พวก HTML , JavaScript และ CSS การใช้งานไม่ยาก โดยทำการติดตั้ง Plugin ลงใน Web Browser เช่น Google Chrome หรือ Mozilla Firefox หลังจากนั้นก็เปิด URL หรือเว็บไซต์ที่ต้องการ และทำการคลิกที่ Icon ของ Firebug จากนั้นโปรแกรม Firebug ก็จะแสดงรายละเอียดโครงสร้าง HTML , JavaScript และ CSS ทั้งหมดใน URL นั้น ๆ เราสามารถทำการคลิกเพื่อแก้ไข CSS หรือแม้กระทั่งตรวจสอบค่าต่าง ๆ ซึ่งการใช้งานนั้นไม่ยากซับซ้อนอะไร

    ผู้เขียนได้ใช้ Firebug กับการทำงานโดยใช้การ debug ที่แท็บ Console ตัวอย่างดังนี้

    เมื่อมีการแจ้งจากผู้ใช้งานระบบว่าข้อมูลแสดงไม่ครบถ้วน จึงทำการตรวจสอบ Service ที่ดึงข้อมูลดังกล่าว โดยใช้ Firebug ในการตรวจสอบ

    6-12-2559-15-31-17

    คลิก Service ที่ต้องการจะแสดงข้อมูลดังนี้ (จะเห็นได้ว่าจากรูปด้านบนแสดงเวลาที่โหลดข้อมูลแต่ละคำสั่งด้วยค่ะ)

    6-12-2559-15-35-51

    ในส่วนอื่น ๆ ก็สามารถศึกษาได้ไม่ยากค่ะ

  • การทดสอบโปรแกรม (Testing)

    วันนี้ขออธิบายสิ่งที่หลาย ๆ คนอาจจะรู้ อาจจะทราบกันอยู่แล้ว แต่บางคนอาจจะยังไม่รู้ถึงกระบวนการและความจำเป็นของการทดสอบระบบ ผู้เขียนจึงขอนำเสนอข้อมูลในเรื่องนี้สักหน่อย เนื่องจากกำลังทำงานหลัก ๆ ที่เกี่ยวกับการทดสอบโปรแกรมเป็นส่วนใหญ่ 

    การ Test คือการทดสอบระบบว่าทำงานได้ถูกต้องได้ผลตามวัตถุประสงค์หรือไม่ ซึ่งเป็นการทดสอบกระบวนการทางพื้นฐานทางคอมพิวเตอร์

    โปรแกรมคอมพิวเตอร์มีหลักการง่าย ๆ คือ Input -> Process -> Output วิธีการกำหนด Test case อย่างง่ายที่สุดคือทำการ Test แต่ละส่วนโดยอยู่บนพื้นฐานของ Business requirement และวัตถุประสงค์ของระบบ ซึ่งจะต้องมีการเขียน Test case โดย Test case เป็นเอกสารที่ระบุชุดข้อมูลป้อนเข้าผลลัพธ์ ที่คาดว่าจะได้รับและกลุ่มของเงื่อนไขในการดำเนินการในชุดทดสอบต่าง ๆ มีจุดมุ่งหมายเพื่อแบ่งฟังก์ชันการทำงานของซอฟต์แวร์ออกเป็นฟังก์ชันย่อย ๆ เพื่อให้สามารถทำการทดสอบโดยชุดข้อมูลป้อนเข้าดังกล่าว และสร้างผลลัพธ์ที่สามารถประเมินผลได้โดยปกติจะขึ้นกับ use case ของระบบ

    “Test case ประกอบด้วย”

    • ชื่อ Test case โดยปกติแล้วคือ Use case ตาม ฺBusiness requirement เช่น การ login เข้าระบบ
    • วัตถุประสงค์ของ Test case นั้น ๆ
    • ผลที่คิดว่าจะได้รับ (Output)
    • กำหนดลักษณะข้อมูลที่จะนำเข้าเพื่อใช้ในการ Test (Input)
    • ขั้นตอนวิธีการทดสอบ เป็น Step 1,2,3,… ว่าแต่ละขั้นตอนต้องทำอะไรบ้าง
    • ผลที่ได้จากการ test

    “ชนิดของการ Test”

    1. ทดสอบความถูกต้อง
      • Unit test เป็นการ test functional ของระบบในแต่ละส่วนย่อยๆเพื่อให้แน่ใจว่าแต่ละส่วนทำงานได้ถูกต้อง
      • Integration test เป็นการนำแต่ละ unit มาประกอบกันและทดสอบการติดต่อระหว่าง unit ว่าสามารถทำงานได้ถูกต้อง
      • End to end test เป็นการทดสอบระบบในภาพรวมโดยนำแต่ละส่วนของระบบมาประกอบกันให้สมบูรณ์ และทดสอบระบบประหนึ่งเป็น ผู้ใช้ของระบบ
    2. ทดสอบคุณภาพ
      • Stress test เป็นการทดสอบประสิทธิภาพของระบบ เพื่อทดสอบว่าระบบสามารถรับจำนวนผู้ใช้, ข้อมูล ได้มากแค่ไหน
      • Usability test เป็นการทดสอบประสิทธิภาพการใช้งานของระบบ เช่น UI เหมาะสมต่อการใช้งานหรือไม่ เข้าใจได้ง่ายหรือไม่

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

    การจะเป็น Tester ที่ดีได้ต้องเข้าใจถึงมาตรฐานต่างๆที่ระบบใช้งาน เพื่อจะได้ทดสอบได้อย่างถูกต้องและแบบมีหลักเกณฑ์ ยกตัวอย่างง่ายๆ หากเป็น Tester ของเว็บไซต์ที่หนึ่ง หากไม่มีความรู้ด้านมาตรฐานหรือด้านเทคนิคเลย จะทดสอบอะไรได้บ้าง? เพียงแต่ click ดูแล้วดูผลลัพธ์ว่าตรงเท่านั้นหรือ?

  • ทดสอบการแสดงผลเว็บแอพพลิเคชันง่ายๆ บน Browser ต่างๆ ด้วยบริการของ Modern IE

    ในปัจจุบันเว็บแอพพลิเคชันที่มีการพัฒนาจะต้องรองรับ Browser และอุปกรณ์ที่แตกต่างกัน ซึ่งบางครั้งเป็นการยากที่เราจะทดสอบให้ครบได้

    จะดีไหมถ้าเราสามารถดูการแสดงผลเว็บแอพพลิเคชันที่พัฒนาว่า หน้าตาเป็นอย่างไรเมื่อแสดงผลบน Browser หรืออุปกรณ์อื่นๆ

    Microsoft ได้เปิดตัว Modern IE ขึ้น โดยมีบริการที่น่าสนใจที่เรียกว่า Browser screenshots !!

    ขั้นตอนที่ 1

    ไปยัง URL : https://dev.modern.ie/tools/screenshots/

    2

    ขั้นตอนที่ 2

    ใส่ URL ของเว็บแอพพลิเคชันของเราที่ต้องการ

    1

    ขั้นตอนที่ 3

    กดปุ่ม Enter หรือรูปแว่นขยาย เครื่องมือจะแสดงผลดังภาพ

    3 4

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

    “หวังว่าจะมีประโยชน์ต่อนักพัฒนาหรือนักทดสอบระบบทุกท่านนะค่ะ”