如何在Visual Studio测试控制器中自动删除测试后的Deployment文件夹
针对你用MTM通过代理机运行Coded UI测试后,需要自动删除控制器机上AppData\Local\VSTQT\QTController\<run_number_folder>里的Deployment文件夹的需求,这里有几个实用的方案,按实现复杂度从低到高排序:
方案1:测试后执行自定义脚本(最推荐)
MTM的测试设置支持在测试运行完成后执行清理脚本,这是最直接的方式:
编写清理脚本
你可以选择PowerShell或批处理脚本,以下是两种示例:- PowerShell脚本(更灵活):
# 定位QTController的根目录 $qtControllerRoot = Join-Path $env:LOCALAPPDATA "VSTQT\QTController" # 按修改时间倒序获取所有运行文件夹(最新的在最前面) $runFolders = Get-ChildItem -Path $qtControllerRoot -Directory | Sort-Object LastWriteTime -Descending foreach ($folder in $runFolders) { $deploymentPath = Join-Path $folder.FullName "Deployment" if (Test-Path $deploymentPath) { # 强制递归删除Deployment文件夹 Remove-Item -Path $deploymentPath -Recurse -Force -ErrorAction SilentlyContinue Write-Host "Successfully deleted Deployment folder: $deploymentPath" } } - 批处理脚本(兼容性好):
@echo off set "QT_CONTROLLER_PATH=%LOCALAPPDATA%\VSTQT\QTController" # 按修改时间倒序遍历所有运行文件夹 for /f "delims=" %%d in ('dir /ad /o-d /b "%QT_CONTROLLER_PATH%"') do ( set "RUN_FOLDER=%QT_CONTROLLER_PATH%\%%d" if exist "%RUN_FOLDER%\Deployment" ( # 静默删除Deployment文件夹 rmdir /s /q "%RUN_FOLDER%\Deployment" echo Deleted Deployment folder: %RUN_FOLDER%\Deployment ) )
把脚本保存到控制器机的某个固定路径,比如
C:\TestScripts\CleanupDeployment.ps1。- PowerShell脚本(更灵活):
配置MTM测试设置
- 打开你的测试计划对应的测试设置(Test Settings)
- 切换到
Setup and Cleanup标签页 - 在
Cleanup scripts区域,点击Add按钮,选择你刚才保存的脚本 - 确保脚本的执行时机设置为
After test run(测试运行结束后)
权限检查
注意Test Controller的服务账号(默认是Network Service)需要拥有%LOCALAPPDATA%\VSTQT\QTController目录的修改/删除权限。你可以右键该目录 → 属性 → 安全 → 添加服务账号,赋予对应的权限。
方案2:创建Test Controller自定义监听插件
如果脚本方式满足不了你的需求(比如需要更精细的控制),可以编写一个Test Controller的扩展插件:
编写监听代码
创建一个C#类库项目,引用Microsoft.VisualStudio.TestTools.Execution.dll(位于C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\PrivateAssemblies),然后实现TestRunListener:using Microsoft.VisualStudio.TestTools.Execution; using System.IO; using System.Linq; public class DeploymentCleanupListener : TestRunListener { public override void TestRunCompleted(TestRunCompletedEventArgs e) { base.TestRunCompleted(e); var qtControllerPath = Path.Combine( System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "VSTQT", "QTController"); // 获取所有运行文件夹,按修改时间倒序处理 var runFolders = new DirectoryInfo(qtControllerPath).GetDirectories() .OrderByDescending(dir => dir.LastWriteTime); foreach (var runFolder in runFolders) { var deploymentDir = Path.Combine(runFolder.FullName, "Deployment"); if (Directory.Exists(deploymentDir)) { Directory.Delete(deploymentDir, true); } } } }部署插件
- 编译项目生成DLL文件
- 将DLL复制到Test Controller的插件目录:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\PrivateAssemblies - 重启
Visual Studio Test Controller服务,使插件生效
方案3:Windows定时任务(被动清理)
如果前两种方式都不适用,你可以设置Windows定时任务定期清理:
- 创建定时任务
- 打开控制器机的「任务计划程序」
- 创建基本任务,设置触发条件(比如每天凌晨2点,或者每隔1小时)
- 选择「启动程序」,指向你的清理脚本(比如PowerShell,参数为
-ExecutionPolicy Bypass -File "C:\TestScripts\CleanupDeployment.ps1") - 确保任务使用的账号有足够权限删除文件夹
这个方案是被动清理,不会在测试结束后立即执行,但适合不需要实时清理的场景。
内容的提问来源于stack exchange,提问作者Pankaj Devrani

