NUnit/Selenium C#项目如何从默认页面调用所有测试用例
解决方案
前置配置
- 首先在Web项目(
Selenium命名空间所属项目)中添加对测试项目(SeleniumTests命名空间所属项目)的项目引用,确保Web项目可以访问测试项目的公共类和方法。 - 在Web项目中安装对应测试框架的核心NuGet包:使用NUnit就安装
NUnit包,使用MSTest就安装MSTest.TestFramework包,保证Web项目可以识别[Test]特性、兼容测试方法的依赖逻辑。
实现调用逻辑
你可以直接在默认页的后端代码中通过反射批量扫描执行测试用例,也可以按需直接调用指定测试方法,示例代码如下:
using System; using System.Reflection; using System.Linq; using SeleniumTests; // NUnit用户用这个引用 using NUnit.Framework; // MSTest用户替换为下面的引用 // using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Selenium { public partial class DefaultPage : Page { protected void Page_Load(object sender, EventArgs e) { // 1. 批量执行所有测试用例逻辑 // 加载测试项目的程序集 Assembly testAssembly = Assembly.GetAssembly(typeof(Login)); // 筛选所有公共测试类,可根据自己的命名规则调整过滤条件 var testClasses = testAssembly.GetTypes().Where(t => t.IsClass && t.IsPublic); foreach (var testClass in testClasses) { // 创建测试类实例,要求测试类必须有公共无参构造函数 object testInstance = Activator.CreateInstance(testClass); // 筛选当前类下所有带[Test]特性的公共方法 var testMethods = testClass.GetMethods(BindingFlags.Public | BindingFlags.Instance) .Where(m => m.GetCustomAttributes(typeof(TestAttribute), false).Any()); foreach (var testMethod in testMethods) { try { // 执行无参测试方法 testMethod.Invoke(testInstance, null); Response.Write($"测试方法 {testClass.Name}.{testMethod.Name} 执行成功<br/>"); } catch (Exception ex) { // 捕获测试执行异常,测试用例本身抛出的断言错误会被包裹在InnerException中 Response.Write($"测试方法 {testClass.Name}.{testMethod.Name} 执行失败,原因:{ex.InnerException?.Message ?? ex.Message}<br/>"); } } } // 2. 仅调用指定测试方法的简化写法,不需要扫描可以直接用下面的代码 // Login loginTest = new Login(); // loginTest.VerifyLoginValid(); } } }
注意事项
- 若你的测试用例依赖
[SetUp]/[TearDown]这类测试框架生命周期特性,需要额外扫描对应特性的方法,在测试方法执行前后手动调用 - 测试用例如果涉及Selenium驱动、数据库连接这类资源,执行后要手动释放,避免进程残留
- 生产环境不要开放这个测试调用入口,避免资源占用和安全风险
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

