通过在命令行中运行测试来再现测试失败
有时,通过从命令行运行测试来重现测试失败非常方便。 以下文档假定控制器计算机上已安装 Hardware Lab Kit (HLK)。
从命令行运行设备基础测试
从命令行运行设备基础测试:
在受测系统 (SUT) 上创建 c:\temp 文件夹。
将 hckcontroller>\taefbinaries\<arch> 文件夹中的所有文件\\<复制到 SUT 上的 c:\temp。
其中<,hckcontroller 是 Windows 硬件实验室工具包 (Windows HLK) 控制器的名称,arch>< 是 SUT 平台。
若要安装和启动 TAEF 服务,请在命令提示符下键入以下命令:
转到上面创建的“temp”文件夹:
在 X86 或 X64 上:cd c:\temp
在 Arm 或 Arm64 上:cd c:\temp\MinTe
wex.services.exe /install:Te.Service
sc start Te.Service
将所有文件从 \\<hckcontroller>\tests\<arch>\DevFund\ 目录复制到 c:\temp。
将目录更改为 c:\temp 并运行以下命令, (请注意,Te.exe位于 arm 和 Arm64) 上的 c:\temp\MinTe 中:
c:\temp\Te.exe Devfund_<testname>.dll /name:"<test case name>" /p:"DQ=DeviceID='<Device Instance Path of device under test from Device Manager>'" /RebootStateFile:state.xml
其中 <,测试用例名称> 是测试二进制文件中测试的名称。
/name 开关是可选的。 某些测试二进制文件包含多个测试,因此 /name 开关指定应运行哪个测试。 如果未指定,则按顺序执行测试二进制文件中包含的所有测试。 可以通过运行以下命令来获取测试二进制文件中的测试列表:
Te.exe Devfund_<testname>.dll /list
例如,Devfund_PnPDTest.dll 包含与 PnP 相关的大多数测试:
c:\temp>Te.exe Devfund_PnPDTest.dll /list Test Authoring and Execution Framework v10.21 for x64 c:\temp\Devfund_PnPDTest.dll PNPDTest PNPDTest::PNPDisableAndEnableDevice PNPDTest::PNPRemoveAndRestartDevice PNPDTest::PNPCancelRemoveDevice PNPDTest::PNPCancelStopDevice PNPDTest::PNPTryStopAndRestartDevice PNPDTest::PNPTryStopDeviceRequestNewResourcesAndRestartDevice PNPDTest::PNPTryStopDeviceAndFailRestart PNPDTest::PNPSurpriseRemoveAndRestartDevice PNPDTest::PNPDIFRemoveAndRescanParentDevice PNPDTest::DisableEnhancedDeviceTestingSupport
用于从此测试二进制文件运行单个测试的命令可能如下所示:
c:\temp\Te.exe Devfund_PnPDTest.dll.dll /name:PNPDTest::PNPSurpriseRemoveAndRestartDevice /p:"DQ=DeviceID='my\device\id'" /RebootStateFile:state.xml
测试二进制文件中测试的名称不会与测试的标题完全相同。 有关测试二进制文件名称与 HLK 测试名称的映射,请参阅 Device.DevFund 测试。
使用 /BreakOnError 进入调试器
如果设备基础测试中的“运行测试”任务失败,并且你想要在测试记录失败的同时在内核调试器中查看系统状态,可以从命令提示符中手动运行测试和内核调试器,然后将 /BreakOnError 命令行开关传递给 Te.exe。
使用 /BreakOnError 开关运行 Te.exe 会导致系统在测试准备好记录错误时进入内核调试器。 有关设置内核调试器的详细信息,请参阅手动设置 Kernel-Mode 调试。
若要使用 /BreakOnError 开关运行设备基础测试,请添加开关,如下所示:
Run c:\temp\Te.exe Devfund_<testname>.dll /p:"DQ=DeviceID='<Device Instance Path of device under test from Device Manager>'" /RebootStateFile:state.xml /BreakOnError /name:"*<test case name>*"
其中 <,测试用例名称> 是测试的名称。
示例调试场景
可以通过重新运行测试,并在测试记录重新运行时发生的故障时让系统进入调试器来调查以下故障。
WDTF_FUZZTEST : INFO : Running IOCTL Fuzzing Test on surface \DosDevices\usb#vid_045e&pid_f0ca&mi_00#7&12099dde&0&0000#{0b9f1048-b94b-dc9a-4ed7-fe4fed3a0deb}\{8de0ff21-6c06-4c27-bfe0-e62612c015ae}. Access Mode=NO SYNC. Open Type=TREE_CONNECT. Opened with access 1201bf
WDTF_FUZZTEST : ERROR : Test thread exceeded timeout limit. Terminating thread
WDTF_FUZZTEST : ERROR : Last logged operation: ZwDeviceIoControlFile, CtrlCode=0x22e10b, InBuf=0xfffffc00, 0 OutBuf=0xfffffc00, 0
WDTF_FUZZTEST : INFO : Successfully terminated test thread.
可以使用以下命令在调试器中设置断点:
Te.exe Devfund_FuzzTest_WLK_Certification.dll /p:"DQ=DeviceID='USB\VID_045E&PID_F0CA&MI_00\7&12099DDE&0&0000'" /RebootStateFile:state.xml /BreakOnError /name:"*IOCTLTest*"
设备基础测试以 Te.ProcessHost.exe(如果存在)或者 Te.exe(如果 Te.ProcessHost.exe 不存在)的方式运行。 查看这些测试过程中运行的线程有助于会审挂起和/或测试失败。
可以通过运行以下命令获取 Te.ProcessHost.exe 的进程 ID:
!process 0 0 Te.ProcessHost.exe
将调试器中的进程上下文切换为测试进程:
.process /p /r <process id>
转储进程信息:
!process <process id>