Ranorex中是否存在类似OnAbort的事件用于用户中止执行时调用方法?
刚好之前在Ranorex项目里碰到过一模一样的需求——要在用户手动中止测试(比如点暂停键、直接关控制台窗口)时自动跑指定方法,不想用TearDown(毕竟它不管啥情况都触发),也不想在每个模块里堆try-catch抓ThreadAbortException。给你几个亲测可行的方案:
1. 用Ranorex内置的TestSuiteAborted事件(最推荐)
Ranorex的TestSuite对象自带TestSuiteAborted事件,这个事件只在用户主动中止测试的时候触发,完全对应你说的测试报告显示"The test run has been aborted by the user."的场景。
你只需要在项目的Program.cs里订阅这个事件就行,不用改其他测试模块:
using Ranorex; using System; class Program { [STAThread] static void Main(string[] args) { // 订阅测试中止事件 TestSuite.Current.TestSuiteAborted += OnTestSuiteAborted; try { TestSuiteRunner.Run(typeof(Program), args); } catch (Exception ex) { Report.Error("测试执行出错", ex); } } private static void OnTestSuiteAborted(object sender, EventArgs e) { // 这里放你要执行的自定义方法 Report.Info("检测到用户手动中止测试,执行自定义处理逻辑"); // 比如调用你的清理方法:CustomCleanupLogic(); } }
这个方案最精准,完全贴合你的需求,而且代码只需要加在入口处,非常干净。
2. 额外处理控制台中断场景(针对命令行运行的测试)
如果你的测试是通过命令提示符启动的,用户可能直接关窗口或者按Ctrl+C中止,虽然上面的TestSuiteAborted基本能覆盖,但可以再加个Console.CancelKeyPress事件做双重保险:
// 在Main方法里添加这段 Console.CancelKeyPress += (sender, e) => { e.Cancel = true; // 先阻止系统直接终止进程 CustomCleanupLogic(); // 执行你的自定义方法 Environment.Exit(1); // 处理完再主动退出 };
这样不管用户用哪种方式中止命令行测试,都能触发你的逻辑。
为啥不推荐TearDown?
你说得对,不管是TestCase还是TestSuite级别的TearDown,都会在测试正常结束、失败、中止等所有场景下执行,没法单独识别用户手动中止的情况,所以肯定不是最优解。
至于ThreadAbortException,如果你的自定义方法需要处理线程中止的异常,只需要在事件处理方法里加一个try-catch就够了,不用在所有模块里撒网,这样也能避免冗余代码。
内容的提问来源于stack exchange,提问作者RandomDisplayName

