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