C# E2E测试:给厌倦生产环境Bug者的指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么单元测试不够用,何时需要E2E测试

\n\n

想象一下:您编写了完美的C#代码。单元测试全部通过,覆盖率95%,代码审查也通过了。您发布版本,但用户反馈:“如果购物车中商品超过3件,‘提交订单’按钮就不工作了”。熟悉吗?

\n\n

单元测试孤立地检查方法。集成测试检查数据库和API的配合。但C#应用程序的E2E测试(端到端测试)是确保整个系统作为一个整体正常工作的唯一方法:浏览器、服务器、数据库、外部API。端到端测试模拟真实用户的操作:点击、输入数据、等待页面加载。

\n\n

本文不仅讲述理论。我们将展示如何使用Selenium和Playwright编写C# E2E测试,如何通过Page Object Model组织代码,以及如何将自动化测试集成到CI/CD中。开始吧。

\n\n

实践中什么是C# E2E测试

\n\n

E2E测试是一个模拟用户完整路径的场景:从打开页面到完成目标操作(购买、注册、提交表单)。对于C#开发者来说,这通常意味着:

\n\n
    \n
  • 通过WebDriver启动浏览器(Chrome、Firefox、Edge)
  • \n
  • 在页面上查找元素(按钮、输入框、链接)
  • \n
  • 执行操作(点击、输入文本、从列表中选择)
  • \n
  • 验证预期结果(出现消息、URL改变、数据更新)
  • \n
  • 关闭浏览器并清理测试数据
  • \n
\n\n

与单元测试的主要区别:E2E测试操作真实的UI。它们速度慢、脆弱(依赖CSS选择器),但对于检查关键业务场景来说不可或缺。

\n\n

C# E2E测试工具:Selenium vs Playwright

\n\n

工具选择是团队面临的第一个问题。让我们看看两个最流行的选项。

\n\n

Selenium WebDriver

\n

行业标准。通过WebDriver工作——一个独立的进程,用于控制浏览器。支持所有浏览器,拥有庞大的社区和成千上万的现成解决方案。缺点:配置需要驱动程序(ChromeDriver、GeckoDriver),并且由于等待,测试可能较慢。

\n\n

用于.NET的Playwright

\n

一个较新但已非常流行的工具,来自Microsoft。直接通过DevTools协议工作,没有多余的中间层。更快、更稳定,自动等待元素加载(无需显式的Thread.Sleep)。不仅支持浏览器,还支持移动模拟器。

\n\n

本文将在两个框架上都展示示例,以便您进行比较。

\n\n

编写第一个C# E2E测试:Selenium

\n\n

从经典开始。通过NuGet安装包:

\n\n
dotnet add package Selenium.WebDriver\ndotnet add package Selenium.Support\ndotnet add package Selenium.WebDriver.ChromeDriver
\n\n

现在为示例网站编写测试(假设是一个在线商店)。我们要验证将商品添加到购物车后,页面上是否出现显示商品数量的图标。

\n\n
using OpenQA.Selenium;\nusing OpenQA.Selenium.Chrome;\nusing OpenQA.Selenium.Support.UI;\n\npublic class CartE2ETests\n{\n    [Fact]\n    public void AddItemToCart_ShouldUpdateCartBadge()\n    {\n        using var driver = new ChromeDriver();\n        \n        // Arrange\n        driver.Navigate().GoToUrl("https://demo-store.com");\n        driver.Manage().Window.Maximize();\n        \n        // Act\n        var addToCartButton = driver.FindElement(By.CssSelector(".product-card .add-to-cart"));\n        addToCartButton.Click();\n        \n        // Wait for badge to appear\n        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));\n        var cartBadge = wait.Until(drv => \n            drv.FindElement(By.CssSelector(".cart-badge")));\n        \n        // Assert\n        Assert.Equal("1", cartBadge.Text);\n        \n        driver.Quit();\n    }\n}
\n\n

博客

书籍推荐