RunFixtureAs
TAEF 使用 RunFixtureAs 在相应测试 ( () 之外的上下文中) 模块、类和测试级设置和清理函数来执行测试装置。
先决条件
- 必须在计算机上安装并运行 Te.Service,以便从非提升的Te.exe进程中运行提升的测试固定例程,或以本地系统的形式运行测试固定例程。
概述
RunFixtureAs 可以在模块、类和 或 测试级别应用,并将沿测试树继承。 为了支持在树中的给定级别选择退出 RunFixtureAs 继承的功能,还支持 RunFixtureAs:[scope] 元数据。
例如,如果模块标有 RunFixtureAs=System,则 (ClassA) 的类可以标记为 RunFixtureAs:Test=Default。 在这种情况下,模块和类固定例程将作为系统运行,但 ClassA 中的测试级固定例程将在与 Te.exe (相同的上下文中运行,尽管仍与测试) 处于不同的进程中。
RunFixtureAs:[scope] 元数据值不是沿测试树继承的;它仅适用于指定的范围。
确定性保证
- 默认情况下, (如果未) 指定 RunFixtureAs 值,则保证测试和固定例程在同一进程中运行。
- 如果使用“Test”以外的有效 RunFixtureAs 值标记了固定例程,则将在与测试不同的进程中运行该固定例程。 这意味着,即使测试标记为 RunAs=Elevated 和 RunFixtureAs=Elevated,测试也将在提升的进程中运行,并且其固定例程将在单独的提升进程中运行。
- 给定范围的匹配固定例程对将始终在同一进程中运行 (例如,类的设置和清理固定例程将在同一进程) 内运行。
RunFixtureAs 类型
TAEF 支持以下 RunFixtureAs 类型,这些类型由测试元数据指定:
系统
TAEF 将固定装置作为本地系统运行。
注意 作为本地系统运行的测试装置不应创建任何 UI。 如果固定例程需要创建 UI 或与 UI 交互,则需要使用 CreateProcessAsUser 将 UI 相关代码移动到桌面上启动的单独可执行文件中。
升高
TAEF 通过生成提升的进程来确保在提升的进程中运行固定例程(如有必要)。
注意 执行 TAEF 的用户必须是管理员组的成员,才能执行标记为 RunFixtureAs=Elevated 的固定例程。 这是因为非管理员没有要提升的拆分令牌。
默认
TAEF 在与 Te.exe (相同的上下文中运行固定装置,但仍在与测试) 不同的进程中运行。
代理
TAEF 在“沉浸式代理”进程中运行固定装置。
注意
- “Broker”仅在Windows 8及更高版本的操作系统上受支持。
- 必须在系统上启用测试签名策略。 有关详细信息, 请参阅 TESTSIGNING 启动配置选项。
- 目前不支持使用“RunFixtureAs=Broker”远程运行测试。
- 使用“RunFixtureAs=Broker”执行时,TAEF 将使用“TE.ProcessHost.Broker.exe”进程来执行固定例程,而不是“TE.ProcessHost.exe”。
UIAccess
TAEF 在标记为 UIAccess 执行级别的进程中运行固定装置。 有关 UI 自动化应用程序的 UIAccess 的信息,请参阅 Windows 完整性机制设计。
注意
- UIAccess 仅在 Vista 和更高版本的操作系统上受支持。
- TAEF 二进制文件必须从计算机上的 Program Files 文件夹下的文件夹中运行。
- 当前不支持使用“RunFixtureAs=UIAccess”远程运行测试。
- 使用“RunFixtureAs=UIAccess”执行时,TAEF 将使用“TE.ProcessHost.UIAccess.exe”进程来执行固定例程,而不是“TE.ProcessHost.exe”。
测试
TAEF 在与测试相同的进程或上下文中运行固定装置。
注意 这是未指定 RunFixtureAs 设置时的默认 TAEF 行为。
RunFixtureAs:[scope]
TAEF 支持以下 RunFixtureAs:[scope] 值,这些值由测试元数据指定。
RunFixtureAs:Module、 RunFixtureAs:Assembly 或 RunFixtureAs:Dll
RunFixtureAs 值将仅适用于测试层次结构中的模块级节点。
RunFixtureAs:Class
RunFixtureAs 值将仅适用于测试层次结构中的类级节点。
RunFixtureAs:Method 或 RunFixtureAs:Test
RunFixtureAs 值将仅适用于测试层次结构中的测试级别节点。
使用 RunFixtureAs 标记测试
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
TEST_CLASS(MyTests);
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
TEST_METHOD_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
前面的示例将运行测试和固定例程,如下所示:
- MyTestMethod 作为系统运行
- MyTestSetup 和 MyTestCleanup 以提升身份运行
- MyClassSetup 和 MyClassCleanup 在与 MyTestMethod) 相同的进程中以系统 (运行
- MyModuleSetup 和 MyModuleCleanup 在与 MyTestMethod) 相同的进程中以系统 (运行
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
前面的示例将运行测试和固定例程,如下所示:
- MyTestMethod 作为系统运行
- MyTestSetup 和 MyTestCleanup 以提升身份运行
- MyClassSetup 和 MyClassCleanup 以提升身份运行
- MyModuleSetup 和 MyModuleCleanup 在与 MyTestMethod) 相同的进程中以系统 (运行
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"System")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
TEST_METHOD_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
前面的示例将运行测试和固定例程,如下所示:
- MyTestMethod 以受限方式运行
- MyTestSetup 和 MyTestCleanup 以提升身份运行
- MyClassSetup 和 MyClassCleanup 作为系统运行
- MyModuleSetup 和 MyModuleCleanup 在与 MyTestMethod) 相同的进程中以受限 (运行
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"System")
TEST_METHOD_PROPERTY(L"RunFixtureAs:Test", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
前面的示例将运行测试和固定例程,如下所示:
- MyTestMethod 作为系统运行
- MyTestMethod2 以受限方式运行
- MyTestSetup 和 MyTestCleanup 作为 Elevated 运行;应用于 MyTests 类中的所有测试方法的 RunFixtureAs:Test 范围
- MyClassSetup 和 MyClassCleanup 在与 MyTestMethod) 不同的进程中作为系统 (运行
- MyModuleSetup 和 MyModuleCleanup 在各自的测试过程的上下文中运行, (System for MyTestMethod 和 Restricted for MyTestMethod2)
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"System")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
TEST_METHOD_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
前面的示例将运行测试和固定例程,如下所示:
- MyTestMethod 作为系统运行
- MyTestMethod2 以受限方式运行
- MyTestSetup 和 MyTestCleanup 作为 System for MyTestMethod 运行,作为 MyTestMethod2 的提升运行
- MyClassSetup 和 MyClassCleanup 在与 MyTestMethod) 不同的进程中作为系统 (运行
- MyModuleSetup 和 MyModuleCleanup 在各自的测试过程的上下文中运行, (System for MyTestMethod 和 Restricted for MyTestMethod2)
BEGIN_MODULE()
MODULE_PROPERTY(L"RunFixtureAs", L"System")
END_MODULE()
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"Default")
TEST_CLASS_PROPERTY(L"RunFixtureAs:Test", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
前面的示例将运行测试和固定例程,如下所示:
- MyTestMethod 作为系统运行
- MyTestMethod2 以受限方式运行
- 对于 MyTestMethod 和 MyTestMethod2,MyTestSetup 和 MyTestCleanup 作为 Elevated 运行
- MyClassSetup 和 MyClassCleanup 在当前运行Te.exe的同一上下文中作为默认 (运行,但在与 MyTestMethod 和 MyTestMethod2 不同的进程中运行)
- MyModuleSetup 和 MyModuleCleanup 在与 MyTestMethod) 不同的进程中作为系统 (运行
BEGIN_MODULE()
MODULE_PROPERTY(L"RunFixtureAs", L"System")
MODULE_PROPERTY(L"RunFixtureAs:Test", L"Test")
END_MODULE()
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
前面的示例将运行测试和固定例程,如下所示:
- MyTestMethod 作为系统运行
- MyTestMethod2 以受限方式运行
- MyTestSetup 和 MyTestCleanup 在与 MyTestMethod 和 MyTestMethod2 相同的进程中运行
- MyClassSetup 和 MyClassCleanup 以提升身份运行
- MyModuleSetup 和 MyModuleCleanup 在与 MyTestMethod) 不同的进程中作为系统 (运行
BEGIN_MODULE()
MODULE_PROPERTY(L"RunFixtureAs", L"System")
MODULE_PROPERTY(L"RunFixtureAs:Test", L"Test")
END_MODULE()
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
TEST_METHOD_PROPERTY(L"RunFixtureAs", L"Elevated")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
前面的示例将运行测试和固定例程,如下所示:
- MyTestMethod 作为系统运行
- MyTestMethod2 以受限方式运行
- MyTestSetup 和 MyTestCleanup 在与 MyTestMethod 相同的进程中运行,并在 MyTestMethod2 的提升进程中运行
- MyClassSetup 和 MyClassCleanup 以提升身份运行
- MyModuleSetup 和 MyModuleCleanup 在与 MyTestMethod) 不同的进程中作为系统 (运行
BEGIN_MODULE()
MODULE_PROPERTY(L"RunFixtureAs", L"System")
END_MODULE()
MODULE_SETUP(MyModuleSetup);
MODULE_CLEANUP(MyModuleCleanup);
class MyTests
{
BEGIN_TEST_CLASS(MyTests)
TEST_CLASS_PROPERTY(L"RunFixtureAs:Class", L"Elevated")
END_TEST_CLASS()
BEGIN_TEST_METHOD(MyTestMethod)
TEST_METHOD_PROPERTY(L"RunAs", L"System")
END_TEST_METHOD()
BEGIN_TEST_METHOD(MyTestMethod2)
TEST_METHOD_PROPERTY(L"RunAs", L"Restricted")
END_TEST_METHOD()
TEST_METHOD_SETUP(MyTestSetup);
TEST_METHOD_CLEANUP(MyTestCleanup);
TEST_CLASS_SETUP(MyClassSetup);
TEST_CLASS_CLEANUP(MyClassCleanup);
};
上述示例将运行测试和固定例程,如下所示:
- MyTestMethod 作为系统运行
- MyTestMethod2 以受限方式运行
- MyTestSetup 和 MyTestCleanup 在与 MyTestMethod) 不同的进程中作为系统 (运行
- MyClassSetup 和 MyClassCleanup 以提升身份运行
- MyModuleSetup 和 MyModuleCleanup 在与 MyTestMethod) 不同的进程中作为系统 (运行