You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:00:38