RunFixtureAs

TAEF использует RunFixtureAs для выполнения тестовых фикстур (модули, классы и функции настройки и финализации на уровне тестов) в контексте, не связанном с соответствующими тестами.

Необходимые условия

  • Te.Service должен быть установлен и запущен на компьютере, чтобы запустить тестовые светильники с повышенными привилегиями из процесса без повышенных привилегий Te.exe или запустить тестовые светильники в качестве локальной системы.

Обзор

Функцию RunFixtureAs можно применять на уровне модуля, класса или теста, и она будет наследоваться по дереву тестирования. Для поддержки возможности отказаться от наследования RunFixtureAs на заданном уровне в дереве также поддерживаются метаданные RunFixtureAs:[scope].

Например, если модуль помечается с помощью RunFixtureAs=System, класс (ClassA) можно пометить как RunFixtureAs:Test=Default. В таком случае фикстуры модуля и класса будут запускаться в контексте системы, но фикстуры тестов в ClassA будут выполняться в том же контексте, что и Te.exe, хотя и в отдельном процессе от теста.

Значение метаданных RunFixtureAs:[scope] не наследуется в иерархии тестирования; оно применяется только к указанной области.

Детерминированные гарантии

  • По умолчанию (если значения RunFixtureAs не указаны), тесты и исправления гарантированно выполняются в рамках одного процесса.
  • Если средство помечается допустимым значением RunFixtureAs, отличным от "Test", средство будет выполняться в другом процессе, отличном от теста. Это означает, что даже если тест отмечен с помощью RunAs=Elevated и RunFixtureAs=Elevated, тест будет выполняться в процессе с повышенными привилегиями, а его фикстуры будут выполняться в отдельном процессе с повышенными привилегиями.
  • Сопоставление пар фикстур для заданной области всегда будет выполняться в рамках одного процесса (например, настройка и очистка классов будут выполняться в рамках одного процесса).

Типы RunFixtureAs

TAEF поддерживает следующие типы RunFixtureAs, которые задаются метаданными теста:

Система
TAEF запускает светильник как локальную систему.

Заметка Тестовые фикстуры, которые запускаются от имени Local System, не должны создавать пользовательский интерфейс. Если необходимо, чтобы ваши фикстуры создавали пользовательский интерфейс или взаимодействовали с ним, перенесите код, связанный с пользовательским интерфейсом, в отдельные исполняемые файлы. Эти файлы запускаются на рабочем столе из тестов с помощью CreateProcessAsUser.

Возвышенный
TAEF гарантирует, что тест выполняется в процессе с повышенными привилегиями, создавая при необходимости такой процесс, в котором будет выполнен тест.

Заметка Пользователь, запускающий TAEF, должен быть членом группы администраторов, чтобы выполнять фикстуры, помеченные RunFixtureAs=Elevated. Это связано с тем, что у неадминистраторов нет разделенного маркера для повышения привилегий.

По умолчанию
TAEF запускает светильник в том же контексте, что и Te.exe (но по-прежнему находится в другом процессе, чем тест).

Брокер
TAEF запускает компонент в процессе 'Immersive Broker'.

Примечание.  

  • Брокер поддерживается только в операционных системах 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:[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 запускаются как 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 запускаются как System
  • 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 выполняются с повышенными привилегиями; область применения RunFixtureAs:Test применяется ко всем методам тестирования в классе MyTests
  • MyClassSetup и MyClassCleanup запускаются как система (в рамках процесса, отличного от MyTestMethod)
  • MyModuleSetup и MyModuleCleanup выполняются в контексте соответствующего тестового процесса (System для MyTestMethod и Restricted для 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 запускаются как Система для MyTestMethod и как с повышенными правами для MyTestMethod2
  • MyClassSetup и MyClassCleanup запускаются как система (в рамках процесса, отличного от MyTestMethod)
  • MyModuleSetup и MyModuleCleanup выполняются в контексте своего соответствующего тестового процесса (System для MyTestMethod и Restricted для 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 выполняется в режиме ограниченного доступа
  • 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 выполняется в режиме ограниченного доступа
  • 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)