Поделиться через


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).