如何使用Selenium NUnit C#执行多数据登录测试用例(含27组账号需求)
嘿,这个需求太常见啦!用NUnit结合Selenium处理27组登录数据的测试,其实有好几种成熟又好用的方案,我给你拆解几个最实用的:
1. 直接用NUnit的TestCase属性(简单直接,适合快速实现)
如果数据量不算特别大(27组其实也能hold住),直接在测试方法上叠加TestCase属性是最快的方式,每组账号密码对应一个TestCase:
[TestFixture] public class LoginTests { private IWebDriver _driver; [SetUp] public void SetupTest() { // 初始化ChromeDriver,记得先通过NuGet安装Selenium.WebDriver和Selenium.WebDriver.ChromeDriver _driver = new ChromeDriver(); _driver.Manage().Window.Maximize(); } // 为27组数据分别添加TestCase [TestCase("user_01", "pass_01")] [TestCase("user_02", "pass_02")] // ... 这里继续添加剩下的25组账号密码 public void VerifyLoginWithDifferentCredentials(string username, string password) { // 导航到登录页 _driver.Navigate().GoToUrl("https://your-login-page.com"); // 输入用户名和密码 _driver.FindElement(By.Id("username-input")).SendKeys(username); _driver.FindElement(By.Id("password-input")).SendKeys(password); // 点击登录按钮 _driver.FindElement(By.CssSelector("button[type='submit']")).Click(); // 断言登录成功(比如检查是否跳转到仪表盘页面) Assert.IsTrue(_driver.Url.Contains("/dashboard"), $"登录失败:用户名 {username}"); } [TearDown] public void CleanupTest() { _driver.Quit(); } }
优缺点:优点是零额外配置,写起来快;缺点是27组数据会让测试方法上方的代码很长,后续修改数据得一个个改,维护起来有点麻烦。
2. 用TestCaseSource属性(推荐!适合中大量数据,易维护)
这个方案可以把测试数据和测试逻辑完全分开,不管是硬编码在代码里,还是从外部文件读取都很方便,是处理多组数据的首选方式:
方式一:硬编码数据源(适合数据不常变动的情况)
[TestFixture] public class LoginTests { private IWebDriver _driver; // 单独定义测试数据源:把27组账号密码放在这里 private static IEnumerable<TestCaseData> GetLoginCredentials() { // 可以直接用yield返回每组数据 yield return new TestCaseData("user_01", "pass_01").SetName("登录测试:用户01"); yield return new TestCaseData("user_02", "pass_02").SetName("登录测试:用户02"); // ... 剩下25组依次添加 // 也可以用列表批量处理,代码更整洁: // var credList = new List<(string Username, string Password)> // { // ("user_01", "pass_01"), // ("user_02", "pass_02"), // // ... 其他数据 // }; // foreach (var cred in credList) // { // yield return new TestCaseData(cred.Username, cred.Password) // .SetName($"登录测试:{cred.Username}"); // } } [SetUp] public void SetupTest() { _driver = new ChromeDriver(); _driver.Manage().Window.Maximize(); } // 用TestCaseSource指定数据源方法 [Test, TestCaseSource(nameof(GetLoginCredentials))] public void VerifyLoginWithDifferentCredentials(string username, string password) { // 登录逻辑和上面完全一样 _driver.Navigate().GoToUrl("https://your-login-page.com"); _driver.FindElement(By.Id("username-input")).SendKeys(username); _driver.FindElement(By.Id("password-input")).SendKeys(password); _driver.FindElement(By.CssSelector("button[type='submit']")).Click(); Assert.IsTrue(_driver.Url.Contains("/dashboard"), $"登录失败:用户名 {username}"); } [TearDown] public void CleanupTest() { _driver.Quit(); } }
方式二:从外部文件读取数据(适合数据常变动或需要保密的情况)
如果不想把账号密码写在代码里,比如要给团队共享测试数据,或者密码敏感,可以把数据存在CSV/JSON文件里,然后读取:
比如先创建一个login_credentials.csv文件(放在项目输出目录):
username,password user_01,pass_01 user_02,pass_02 ...
然后修改数据源方法:
private static IEnumerable<TestCaseData> GetCredentialsFromCsv() { // 获取CSV文件路径 var csvPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "login_credentials.csv"); // 跳过表头,读取每一行数据 foreach (var line in File.ReadAllLines(csvPath).Skip(1)) { var parts = line.Split(','); if (parts.Length == 2) { yield return new TestCaseData(parts[0].Trim(), parts[1].Trim()) .SetName($"登录测试:{parts[0].Trim()}"); } } }
然后把TestCaseSource指向这个方法就行,后续维护数据只需要改CSV文件,不用动测试代码!
3. 用ValueSource属性(更简洁的数组/列表数据源)
如果数据是简单的结构化集合,用ValueSource会更紧凑:
[TestFixture] public class LoginTests { private IWebDriver _driver; // 直接定义一个数组存储27组数据 private static readonly (string Username, string Password)[] _loginCredentials = { ("user_01", "pass_01"), ("user_02", "pass_02"), // ... 剩下25组数据 }; [SetUp] public void SetupTest() { _driver = new ChromeDriver(); _driver.Manage().Window.Maximize(); } // 用ValueSource绑定数据源 [Test] public void VerifyLoginWithDifferentCredentials([ValueSource(nameof(_loginCredentials))] (string Username, string Password) credentials) { _driver.Navigate().GoToUrl("https://your-login-page.com"); _driver.FindElement(By.Id("username-input")).SendKeys(credentials.Username); _driver.FindElement(By.Id("password-input")).SendKeys(credentials.Password); _driver.FindElement(By.CssSelector("button[type='submit']")).Click(); Assert.IsTrue(_driver.Url.Contains("/dashboard"), $"登录失败:用户名 {credentials.Username}"); } [TearDown] public void CleanupTest() { _driver.Quit(); } }
这个方式代码更简洁,适合数据结构简单的场景。
额外小贴士
- 并行执行:27组测试如果串行跑会很慢,可以在NUnit的配置文件(
nunit.runner.json)里开启并行测试,只要每个测试用例都在SetUp里新建独立的WebDriver实例,就不会互相干扰。 - 敏感数据处理:如果密码是敏感信息,不要明文存储,可以用加密工具加密后存在文件里,读取时再解密。
- 失败重试:如果偶尔出现网络波动导致登录失败,可以用NUnit的
Retry属性给测试方法添加重试机制。
内容的提问来源于stack exchange,提问作者Poornima
相关产品推荐
相关产品推荐

