TDD 練習 (2) – 測試轉成 Specflow (使用 SpecFlow.Table 處理資料集) 及將 Table 轉成 array

      在〈TDD 練習 (2) – 測試轉成 Specflow (使用 SpecFlow.Table 處理資料集) 及將 Table 轉成 array〉中留言功能已關閉

使用 LeetCode 929 練習測試

大致需求就是

  • 驗證 Email 格式
  • Email 抬頭部分,如果出現 . 號 則去除 如 m.y@email.com 就變成 my@email.com
  • Email 抬頭部分,如果有 + 號 則後面這段忽略 如 m.y+name@email.com 就是 my@email.com
  • 重覆地忽略不計,統計所有 Email 數量輸出

Solution 程式碼如下 :

    internal class Solution
    {
        private string patten = @"^([a-zA-Z\d.]+)(\+[+a-zA-Z\d.]+)?@([a-zA-Z\d.]+.com)$";
        public int NumUniqueEmails(string[] emails)
        {
            HashSet<string> seen = new HashSet<string>();
            foreach (var email in emails)
            {
                var uniqueEmail = GetUniqueEmail(email);
                if (!String.IsNullOrEmpty(uniqueEmail))
                {
                    seen.Add(uniqueEmail);
                };
            }
            return seen.Count;
        }


        public string GetUniqueEmail(string email)
        {
            var match = System.Text.RegularExpressions.Regex.Match(email, patten);

            var email1 = match.Groups[1].Value.Replace(".", "") + "@" + match.Groups[3].Value;

            if (!String.IsNullOrEmpty(match.Groups[1].Value))
            {
                return email1;
            }
            return "";
        }
    }

目標是將下面測試轉成 Specflow :

     [TestMethod]
        public void NumUniqueEmailsMutiEmailCheck2()
        {
            //arrange
            var emails = new string[] { "fg.r.u.uzj+o.pw@kziczvh.com", "r.cyo.g+d.h+b.ja@tgsg.z.com", "fg.r.u.uzj+o.f.d@kziczvh.com", "r.cyo.g+ng.r.iq@tgsg.z.com", "fg.r.u.uzj+lp.k@kziczvh.com", "r.cyo.g+n.h.e+n.g@tgsg.z.com", "fg.r.u.uzj+k+p.j@kziczvh.com", "fg.r.u.uzj+w.y+b@kziczvh.com", "r.cyo.g+x+d.c+f.t@tgsg.z.com", "r.cyo.g+x+t.y.l.i@tgsg.z.com", "r.cyo.g+brxxi@tgsg.z.com", "r.cyo.g+z+dr.k.u@tgsg.z.com", "r.cyo.g+d+l.c.n+g@tgsg.z.com", "fg.r.u.uzj+vq.o@kziczvh.com", "fg.r.u.uzj+uzq@kziczvh.com", "fg.r.u.uzj+mvz@kziczvh.com", "fg.r.u.uzj+taj@kziczvh.com", "fg.r.u.uzj+fek@kziczvh.com" };

            //act
            var solution = new Solution();
            var actual = solution.NumUniqueEmails(emails);

            //assert
            var expected = 2;
            Assert.AreEqual(expected, actual);
        }

所以建立了 Scenario :

Scenario: NumUniqueEmails
	Given I have emails
	| email                        |
	| fg.r.u.uzj+o.pw@kziczvh.com  |
	| r.cyo.g+d.h+b.ja@tgsg.z.com  |
	| fg.r.u.uzj+o.f.d@kziczvh.com |
	| r.cyo.g+ng.r.iq@tgsg.z.com   |
	| fg.r.u.uzj+lp.k@kziczvh.com  |
	| r.cyo.g+n.h.e+n.g@tgsg.z.com |
	| fg.r.u.uzj+k+p.j@kziczvh.com |
	| fg.r.u.uzj+w.y+b@kziczvh.com |
	| r.cyo.g+x+d.c+f.t@tgsg.z.com |
	| r.cyo.g+x+t.y.l.i@tgsg.z.com |
	| r.cyo.g+brxxi@tgsg.z.com     |
	| r.cyo.g+z+dr.k.u@tgsg.z.com  |
	| r.cyo.g+d+l.c.n+g@tgsg.z.com |
	| fg.r.u.uzj+vq.o@kziczvh.com  |
	| fg.r.u.uzj+uzq@kziczvh.com   |
	| fg.r.u.uzj+mvz@kziczvh.com   |
	| fg.r.u.uzj+taj@kziczvh.com   |
	| fg.r.u.uzj+fek@kziczvh.com   | 
	When I exec NumUniqueEmails
	Then the result should be 2

這邊遇到了小問題, table 轉成 ienumerable<string> 後並沒有抓到值,所以使用了 table.Rows.Select 來處理 :

var emails = table.Rows.Select(r => r["email"]).ToArray();

執行 :

結果 :

 

[C#.NET][SpecFlow] 使用 SpecFlow.Table 處理多筆資料驗証 | 余小章 @ 大內殿堂 – 點部落

c# – How to convert SpecFlow table to array of strings – Stack Overflow

print