重構學習筆記(4)-大話重構第四章-自動化測試-筆記

重構

自動化測試:關於Nunit

  1. 在Web Request,Reponse 和 Session和Cookie不太合適用Mock
  2. 自動化測試程式比較忌諱存取資料庫,因為下次執行不見得成功,資料庫不穩定結果會隨時變更,唯一可以做的就是Mock Data Layer(筆者常用的Repository層)

總結:並不是所有程式都合適加入自動化測試。

這個章節在講加入測試的部分,透過重構之後加入測試專案,用Nunit的套件,筆者是用.net 所以把範例有調整過以C#為主。

而根據三種情境,進行測試早安、午安、晚安的三種情境….

工具是採用NUnit

筆者依據這個Sample調整改寫我要的情境,依據前面的重構再加入時間的Library,接近Java的範例

  /// <summary>
    /// A utility about time.
    /// </summary>
    public class DateUtil
    {
        /// <summary>
        /// Get current hour of day.
        /// </summary>
        /// <param name="now"></param>
        /// <returns>
        /// current hour of day
        /// </returns>
        public int getHours(DateTime now)
        {
            Calendar calendar = new Calendar();
            calendar.setTime(now);
            return calendar.get(calendar.HOUR_OF_DAY);

        }
        /// <summary>
        /// Get current Datetime
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="day"></param>
        /// <param name="hh"></param>
        /// <param name="mm"></param>
        /// <param name="ss"></param>
        /// <returns></returns>
        public DateTime createDate(int year, int month, int day, int hh, int mm, int ss)
        {
            return new DateTime(year, month, day, hh, mm, ss);
        }
    }
    /// <summary>
    /// The Refactoring's Hello-world program
    /// author eddie
    /// </summary>
    public class HelloWorld
    {
        /// <summary>
        /// Say hello to everyone.
        /// </summary>
        /// <param name="now"></param>
        /// <param name="user"></param>
        /// <returns>
        /// the words what to say
        /// /// </returns>
        public string sayHello(DateTime now, string user)
        {
            var dateUtil = new DateUtil();
            int hour = dateUtil.getHours(now);
            var greeting = new Greeting();

            if (hour >= 6 && hour < 12)
                return "Hi, " + user + "." + "Good morning!";
            else if (hour > 12 && hour < 19)
                return "Hi, " + user + "." + "Good afternoon!";
            else
                  return "Hi, " + user + "." + "Good night!";
        }
    }

開始撰寫三個測試情境

    [TestFixture]
    public class HelloTest
    {
        public DateUtil dateUtil;
        public HelloWorld helloWorld;
        [SetUp]
        public void Setup()
        {
            dateUtil = new DateUtil();
            helloWorld = new HelloWorld();
        }
        [Test]
        public void testSayHelloInTheMorning()
        {
            DateTime now = dateUtil.createDate(2013, 9, 7, 9, 23, 11);
            string user = "張三";
            string result = "";
            result = helloWorld.sayHello(now, user);
            Assert.AreEqual("Hi, 張三.Good morning!",result);
        }
        [Test]
        public void testSayHelloInTheAfternoon()
        {
            DateTime now = new DateUtil().createDate(2013, 9, 7, 15, 7, 11);
            string user = "張三";
            string result = "";
            result = helloWorld.sayHello(now, user);
            Assert.AreEqual("Hi, 張三.Good afternoon!", result);
        }

        [Test]
        public void testSayHelloInTheAtNight()
        {
            DateTime now = new DateUtil().createDate(2013, 9, 7, 21, 30, 11);
            string user = "張三";
            string result = "";
            result = helloWorld.sayHello(now, user);
            Assert.AreEqual("Hi, 張三.Good night!", result);
        }
    }

加入測試之後,接者使用者出現需求變化要編寫所謂的Happy New Year、9月份暑假

接者就要開始跑測試,為什麼測試會出錯,是因為需求已經出現變化,所以必須要為每一個程式編寫測試案例,讓他全部Pass

總結:從這個例子的演練過來會變成以下的步驟是

  1. 第一步:調整程式順序、追加註解、進行分段、並修改相關變數與命名,以利閱讀,因為此次加入測試程式之後,可以編譯,雖然程式內部有調整、但是外部沒變化、重構成功可以進行後續工作。
  2. 第二步:提取方法在SayHello()分別提出getFirstGreeting()和getSecondGreeting()和getHour()、在執行測試程式。
  3. 第三步:提取類別,分別在getFirstGreeting()和getSecondGreeting()形成GreetingToUser和GreetingAboutTime完成之後、測試通過。
  4. 第四步:當我們需求出現變化,還要依據不同日期判斷是否是節日狀況,我們採用兩頂帽子進行開發【首先先不引入新的需求,先修改原程式,適應新需求,提煉出DateUtil,增加getHour(),getMonth,getDate(),完成重構後測試通過。

當如果其中一個測試程式沒辦法pass,就得調整測試程式,為每一個情境寫測試,讓測試通過。

關於兩頂帽子:https://www.ithome.com.tw/voice/115057

IT界的影武者