1
Vote

DateRangeBVT 測試失敗

description

UnitTest\RandomDataTest.cs 之 DateRangeBVT() 無法通過測試。出問題的是這幾行:

DateTime dt = rnd.Date("1/1/04", "1/31/04");
Assert.IsTrue(dt > DateTime.Parse("1/1/04"), "Date is greater than lower bound");
Assert.IsTrue(dt < DateTime.Parse("1/31/04"), "Date is less than lower bound");
 
這些日期字串依繁體中文版之預設日期格式字串會無法解析,因此我改成下列後即可通過測試:

DateTime startDate = new DateTime(2004, 1, 1);
DateTime endDate = new DateTime(2004, 1, 31);
DateTime dt = rnd.Date(startDate.ToShortDateString(), endDate.ToShortDateString());
Assert.IsTrue(dt > startDate, "Date is greater than lower bound");
Assert.IsTrue(dt < endDate, "Date is less than lower bound");

comments

yjchiou wrote Oct 28, 2008 at 2:37 AM

關於這個問題有另外的做法供參考,如下:

將 UnitTest\RandomDataTest.cs 之 DateRangeBVT() 指定CultureInfo 為 en-US
    [TestMethod]
    public void DateRangeBVT()
    {
        CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
        for (int i = 0; i < 20; i++)
        {
            DateTime dt = rnd.Date("1/1/04", "1/31/04");
            Assert.IsTrue(dt > DateTime.Parse("1/1/04", culture), "Date is greater than lower bound");
            Assert.IsTrue(dt < DateTime.Parse("1/31/04", culture), "Date is less than lower bound");

            Log.Info(rnd.FullDateString(dt), "DateRangeBVT");
        }
    }
及將 RandomData.cs 之 Date() 指定CultureInfo 為 en-US
    public DateTime Date(string startDate, string endDate)
    {
        CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
        return Date(DateTime.Parse(startDate, culture), DateTime.Parse(endDate, culture));
    }
Hope this helps,
Jacky
http://blogs.msnd.com/jchiou

ChrisTorng wrote Nov 7, 2008 at 2:52 AM

我認為指定 CultureInfo 不理想。像我就完全不知道美國是用「日月年」還是「月日年」,只有看到 "1/31/04" 時,才有辦法猜測日期是 2004 年 1 月 31 日。

用字串指定對多國語系環境也不利,我可以自由更改系統的日期格式字串,屆時即使指定了語系,測試仍然可能會失敗。

另外針對 CultureInfo 我不太熟悉,但是否會受目前執行緒之 DateTimeFormatInfo 影響呢?如果待測程式指定自己執行緒所使用的 DateTimeFormatInfo 內容,屆時 TestAutomation.dll 連結進去測試,將會使用同一個執行緒。如果 TestAutomation 設定自己的 DateTimeFormatInfo,是否會影響待測程式的日期字串格式輸出/解析? 如果自己不設,待測程式卻設了,測試是否會失敗?

不如使用 new DateTime(2004, 1, 31),絕對沒有任何疑義。

另外先前我並沒有注意到:

public DateTime Date(string startDate, string endDate)
{
return Date(DateTime.Parse(startDate, culture), DateTime.Parse(endDate, culture));
}

這個函式。這裡我倒認為不應該指定文化,特別是這個專案預計要給繁體中文使用者用的...

因為我是繁體中文使用者,我會用自己熟悉的日期格式字串。在不明確指定的情況下,或者只有待測應用程式依自己的需求自訂 DateTimeFormatInfo 格式,待測應用程式及 TestAutomation 都會以同一個規則解析日期字串,因此可以說不會產生任何問題。在明確指定的情況下,傳給 RandomData.Date() 要用美式日期,傳給待測程式卻要用繁中格式日期,這種不一致的情況,最容易導致犯錯。

wrote Feb 1, 2013 at 11:44 PM