RunFixtureAs
TAEF использует RunFixtureAs для выполнения тестовых приспособлений (модулей, классов и функций установки и очистки на уровне теста) в контексте, отличном от соответствующих тестов.
Необходимые условия
- Te.Service должен быть установлен и запущен на компьютере, чтобы запускать тестовые средства с повышенными привилегиями из процесса без повышенных привилегий Te.exe или запускать тестовые средства в качестве локальной системы.
Обзор
RunFixtureAs можно применить на уровне модуля, класса и или теста и будет наследоваться в дереве тестов. Для поддержки возможности отказа от наследования RunFixtureAs на заданном уровне в дереве также поддерживаются метаданные RunFixtureAs:[область].
Например, если модуль помечен как RunFixtureAs=System, класс (ClassA) можно пометить как RunFixtureAs:Test=Default. В этом случае модуль и средства класса будут работать как System, но тестовые средства в Классе А будут выполняться в том же контексте, что и Te.exe (хотя все еще в процессе, отличном от процесса теста).
Значение метаданных RunFixtureAs:[область] не наследуется в дереве тестирования; оно применяется только к указанному область.
Детерминированные гарантии
- По умолчанию (если значения RunFixtureAs не указаны) тесты и средства гарантированно будут выполняться в рамках одного процесса.
- Если средство помечено допустимым значением RunFixtureAs, отличным от "Test", оно будет выполняться в процессе, отличном от процесса теста. Это означает, что даже если тест помечен как RunAs=Elevated и RunFixtureAs=Elevated, тест будет выполняться в процессе с повышенными привилегиями, а его средства будут выполняться в отдельном процессе с повышенными привилегиями.
- Сопоставление пар приспособлений для заданного область всегда будет выполняться в рамках одного процесса (например, средства установки и очистки класса будут выполняться в рамках одного процесса).
Типы RunFixtureAs
TAEF поддерживает следующие типы RunFixtureAs, которые задаются метаданными теста:
Системы
TAEF запускает средство в качестве локальной системы.
Примечание Тестовые средства, которые запускаются как локальная система, не должны создавать пользовательский интерфейс. Если вашим средствам требуется создать пользовательский интерфейс или взаимодействовать с ним, необходимо переместить код, связанный с пользовательским интерфейсом, в отдельные исполняемые файлы, запускаемые на рабочем столе из тестов с помощью CreateProcessAsUser.
Повышенной
TAEF гарантирует, что приспособление выполняется в процессе с повышенными привилегиями, создавая процесс с повышенными привилегиями, в котором при необходимости будет выполняться приспособление.
Примечание Пользователь, выполняющий TAEF, должен быть членом группы администраторов, чтобы выполнять средства, помеченные runFixtureAs=Elevated. Это связано с тем, что у пользователей, не являющихся администраторами, нет разделенного маркера для повышения уровня.
По умолчанию
TAEF запускает средство в том же контексте, что и Te.exe (но по-прежнему в рамках процесса, отличного от процесса теста).
Брокер
TAEF запускает средство в процессе "Иммерсивный брокер".
Примечание
- Брокер поддерживается только в Windows 8 и более поздних операционных системах.
- В системе должна быть включена политика подписи теста. Дополнительные сведения см. в разделе Параметр конфигурации загрузки TESTSIGNING.
- Удаленное выполнение тестов с помощью RunFixtureAs=Broker в настоящее время не поддерживается.
- При выполнении с "RunFixtureAs=Broker" TAEF будет использовать процесс "TE.ProcessHost.Broker.exe" для выполнения средства, а не "TE.ProcessHost.exe".
UIAccess
TAEF запускает средство в процессе, помеченном уровнем выполнения UIAccess. Сведения о UIAccess для приложений автоматизации пользовательского интерфейса см. в разделе Проектирование механизмов целостности Windows.
Примечание
- UIAccess поддерживается только в операционных системах Vista и более поздних версий.
- Двоичные файлы TAEF должны выполняться из папки в папке Program Files на компьютере.
- Удаленное выполнение тестов с помощью RunFixtureAs=UIAccess в настоящее время не поддерживается.
- При выполнении с параметром RunFixtureAs=UIAccess TAEF будет использовать процесс TE.ProcessHost.UIAccess.exe для выполнения средства, а не "TE.ProcessHost.exe".
Тест
TAEF запускает средство в том же процессе или контексте, что и тест.
Примечание Это поведение TAEF по умолчанию, если параметры RunFixtureAs не указаны.
RunFixtureAs:[область]
TAEF поддерживает следующие значения RunFixtureAs:[область], которые задаются метаданными теста.
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 выполняются от имени system (в рамках одного процесса с MyTestMethod)
- MyModuleSetup и MyModuleCleanup выполняются от имени system (в рамках одного процесса с 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 выполняются от имени system (в рамках одного процесса с 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 выполняются от имени Restricted (в рамках одного процесса с 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 выполняется от имени Restricted
- MyTestSetup и MyTestCleanup выполняются с повышенными привилегиями; область RunFixtureAs:Test, применяемая ко всем методам теста в классе MyTests
- 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 выполняется от имени Restricted
- MyTestSetup и MyTestCleanup выполняются как System для 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 выполняется от имени Restricted
- MyTestSetup и MyTestCleanup выполняются с повышенными привилегиями для MyTestMethod и MyTestMethod2.
- 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 выполняется от имени Restricted
- 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 выполняется от имени Restricted
- 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 выполняется от имени Restricted
- MyTestSetup и MyTestCleanup выполняются от имени системы (в процессе, отличном от Процесса MyTestMethod).
- MyClassSetup и MyClassCleanup выполняются с повышенными привилегиями
- MyModuleSetup и MyModuleCleanup выполняются от имени системы (в процессе, отличном от Процесса MyTestMethod).