使用 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