方法一:直接使用VBS调度(推荐)
1. 创建执行TestNG的VBS脚本
' run_testng.vbs
Set WshShell = CreateObject("WScript.Shell")
' 设置Java和TestNG相关路径
javaPath = "C:\Program Files\Java\jdk-11\bin\java.exe"
projectPath = "D:\YourProject"
testngXml = "testng.xml"
' 构建执行命令
cmd = chr(34) & javaPath & chr(34) & _
" -cp """ & projectPath & "\target\test-classes;" & _
projectPath & "\target\classes;" & _
projectPath & "\lib\*""" & _
" org.testng.TestNG " & _
" -testclass """ & projectPath & "\" & testngXml & """"
' 执行命令
WshShell.Run cmd, 1, True
' 记录日志
Set fso = CreateObject("Scripting.FileSystemObject")
Set logFile = fso.OpenTextFile("D:\logs\testng_execution.log", 8, True)
logFile.WriteLine Now() & " - TestNG执行完成"
logFile.Close
2. 创建定时调度的VBS脚本
' schedule_testng.vbs
Set WshShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
' 脚本路径
vbsPath = "D:\scripts\run_testng.vbs"
' 使用Windows任务计划程序创建定时任务
taskName = "RunTestNGDaily"
scheduleCmd = "schtasks /create /tn """ & taskName & """ /tr """ & vbsPath & """ /sc daily /st 09:00"
' 执行创建任务
WshShell.Run scheduleCmd, 0, True
MsgBox "定时任务已创建,每天9:00执行TestNG测试"
方法二:使用Windows任务计划程序 + VBS
1. 创建批处理文件
@echo off
REM run_testng.bat
set JAVA_HOME=C:\Program Files\Java\jdk-11
set PROJECT_PATH=D:\YourProject
cd %PROJECT_PATH%
%JAVA_HOME%\bin\java -cp "target\test-classes;target\classes;lib\*" org.testng.TestNG -testclass testng.xml
echo %date% %time% TestNG执行完成 >> D:\logs\testng.log
2. 创建VBS来设置定时任务
' create_scheduled_task.vbs
Set service = CreateObject("Schedule.Service")
Call service.Connect()
' 创建任务
Set rootFolder = service.GetFolder("\")
Set taskDefinition = service.NewTask(0)
' 设置触发器(每天上午10点)
Set trigger = taskDefinition.Triggers.Create(2) ' 2 = 每天
trigger.StartBoundary = DateAdd("d", 1, Date) & "T10:00:00"
trigger.Enabled = True
' 设置执行动作
Set action = taskDefinition.Actions.Create(0) ' 0 = 执行程序
action.Path = "cmd.exe"
action.Arguments = "/c D:\scripts\run_testng.bat"
' 设置任务信息
taskDefinition.RegistrationInfo.Description = "定时执行TestNG测试"
taskDefinition.Settings.Enabled = True
taskDefinition.Settings.Hidden = False
' 注册任务
rootFolder.RegisterTaskDefinition("TestNG Daily Run", taskDefinition, 6, , , 3)
MsgBox "定时任务创建成功!"
方法三:简单的循环等待方式(适合短期测试)
' simple_scheduler.vbs
Set WshShell = CreateObject("WScript.Shell")
' 每24小时执行一次
Do While True
' 执行TestNG
WshShell.Run "java -cp ""target\test-classes;target\classes;lib\*"" org.testng.TestNG testng.xml", 1, True
' 记录执行时间
Set fso = CreateObject("Scripting.FileSystemObject")
Set log = fso.OpenTextFile("execution.log", 8, True)
log.WriteLine "TestNG执行时间: " & Now()
log.Close
' 等待24小时(86400000毫秒)
WScript.Sleep(86400000)
Loop
方法四:使用XML配置的完整方案
1. 创建配置文件 config.xml
<!-- config.xml -->
<configuration>
<java>C:\Program Files\Java\jdk-11\bin\java.exe</java>
<project>D:\YourIdeaProject</project>
<testng>testng.xml</testng>
<schedule>
<time>14:30</time>
<interval>daily</interval>
</schedule>
</configuration>
2. 创建主调度VBS脚本
' main_scheduler.vbs
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.load("config.xml")
' 读取配置
javaPath = xmlDoc.selectSingleNode("//java").text
projectPath = xmlDoc.selectSingleNode("//project").text
testngFile = xmlDoc.selectSingleNode("//testng").text
scheduleTime = xmlDoc.selectSingleNode("//schedule/time").text
' 创建执行函数
Sub RunTestNG()
Set WshShell = CreateObject("WScript.Shell")
cmd = chr(34) & javaPath & chr(34) & _
" -cp """ & projectPath & "\target\test-classes;" & _
projectPath & "\target\classes;" & _
projectPath & "\lib\*""" & _
" org.testng.TestNG " & _
" """ & projectPath & "\" & testngFile & """"
WshShell.Run cmd, 1, True
End Sub
' 定时调度逻辑
If Hour(Now()) = CInt(Left(scheduleTime, 2)) And _
Minute(Now()) = CInt(Mid(scheduleTime, 4, 2)) Then
RunTestNG()
' 发送邮件通知(可选)
SendEmailNotification "TestNG测试执行完成"
End If
推荐的最佳实践
1. 使用Windows任务计划程序(最稳定)
' 推荐:使用schtasks命令创建定时任务
Set WshShell = CreateObject("WScript.Shell")
cmd = "schtasks /create /tn ""TestNG_Automation"" " & _
"/tr ""D:\scripts\run_testng.bat"" " & _
"/sc daily /st 09:00 /ru System"
WshShell.Run cmd, 0, True
2. 带错误处理的完整脚本
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
' 错误处理函数
Function RunTestWithRetry(maxRetries)
For retry = 1 To maxRetries
On Error Resume Next
result = WshShell.Run("java -cp ...", 1, True)
If Err.Number = 0 Then
LogMessage "执行成功,尝试次数: " & retry
Exit Function
Else
LogMessage "第" & retry & "次尝试失败: " & Err.Description
WScript.Sleep(5000) ' 等待5秒后重试
End If
Next
LogMessage "执行失败,达到最大重试次数"
End Function
3. 集成到Jenkins/CI工具
如果已有CI环境,建议直接使用:
- Jenkins的定时构建功能
- GitLab CI/CD的pipeline调度
- GitHub Actions的定时工作流
注意事项
环境变量:确保Java和项目路径正确
权限问题:以管理员身份运行VBS脚本
日志记录:重要操作都要记录日志
异常处理:添加适当的错误处理机制
资源清理:测试完成后清理临时文件
最简单的实现方式:使用Windows任务计划程序调用批处理文件,这是最稳定可靠的方法。