为什么单元测试不够用,何时需要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\nE2E测试是一个模拟用户完整路径的场景:从打开页面到完成目标操作(购买、注册、提交表单)。对于C#开发者来说,这通常意味着:
\n\n- \n
- 通过WebDriver启动浏览器(Chrome、Firefox、Edge) \n
- 在页面上查找元素(按钮、输入框、链接) \n
- 执行操作(点击、输入文本、从列表中选择) \n
- 验证预期结果(出现消息、URL改变、数据更新) \n
- 关闭浏览器并清理测试数据 \n
与单元测试的主要区别:E2E测试操作真实的UI。它们速度慢、脆弱(依赖CSS选择器),但对于检查关键业务场景来说不可或缺。
\n\nC# E2E测试工具:Selenium vs Playwright
\n\n工具选择是团队面临的第一个问题。让我们看看两个最流行的选项。
\n\nSelenium 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\ndotnet add package Selenium.WebDriver\ndotnet add package Selenium.Support\ndotnet add package Selenium.WebDriver.ChromeDriver\n\n现在为示例网站编写测试(假设是一个在线商店)。我们要验证将商品添加到购物车后,页面上是否出现显示商品数量的图标。
\n\nusing 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
博客
书籍推荐
推荐阅读