Bagikan melalui


RunFixtureAs

TAEF menggunakan RunFixtureAs untuk menjalankan perlengkapan pengujian (modul, kelas, dan fungsi penyiapan dan pembersihan tingkat pengujian) dalam konteks selain pengujian yang sesuai.

Prasyarat

  • Te.Service harus diinstal dan berjalan pada mesin untuk menjalankan perlengkapan pengujian yang ditingkatkan dari proses Te.exe yang tidak ditingkatkan, atau untuk menjalankan perlengkapan pengujian sebagai Sistem Lokal.

Ikhtisar

RunFixtureAs dapat diterapkan pada tingkat modul, kelas, dan atau pengujian, dan akan diwarisi ke bawah pohon pengujian. Untuk mendukung kemampuan untuk menolak warisan RunFixtureAs pada tingkat tertentu di pohon, metadata RunFixtureAs:[scope] juga didukung.

Misalnya, jika modul ditandai dengan RunFixtureAs=System, kelas (ClassA) dapat ditandai sebagai RunFixtureAs:Test=Default. Dalam kasus seperti itu, modul dan perlengkapan kelas akan berjalan sebagai Sistem, tetapi perlengkapan tingkat pengujian dalam ClassA akan dijalankan dalam konteks yang sama dengan Te.exe (meskipun masih dalam proses yang berbeda dari pengujian).

Nilai metadata RunFixtureAs:[scope] tidak diwarisi ke pohon pengujian; hanya berlaku untuk cakupan yang ditentukan.

Jaminan Deterministik

  • Secara default (jika tidak ada nilai RunFixtureAs yang ditentukan), pengujian dan perlengkapan dijamin berjalan dalam proses yang sama.
  • Jika fikstur ditandai dengan nilai RunFixtureAs yang valid selain 'Uji', perlengkapan akan dijalankan dalam proses yang berbeda dari pengujian. Ini berarti bahwa bahkan jika pengujian ditandai dengan RunAs=Elevated dan RunFixtureAs=Elevated, pengujian akan berjalan dalam proses yang ditinggikan, dan perlengkapannya akan berjalan dalam proses yang ditinggikan terpisah.
  • Pasangan fikstur yang cocok untuk cakupan tertentu akan selalu dijalankan dalam proses yang sama (misalnya, perlengkapan penyiapan dan pembersihan kelas akan dijalankan dalam proses yang sama).

Jenis RunFixtureAs

TAEF mendukung jenis RunFixtureAs berikut, yang ditentukan oleh metadata pengujian:

Sistem
TAEF menjalankan perlengkapan sebagai Sistem Lokal.

Catatan Perlengkapan pengujian yang Anda jalankan sebagai Sistem Lokal tidak boleh membuat UI apa pun. Jika perlengkapan Anda perlu membuat atau berinteraksi dengan UI, Anda perlu memindahkan kode terkait UI ke executable terpisah yang diluncurkan di desktop dari pengujian Anda menggunakan CreateProcessAsUser.

Ditinggikan
TAEF memastikan bahwa perlengkapan dijalankan dalam proses yang ditingkatkan dengan menelurkan proses yang ditingkatkan untuk menjalankan perlengkapan jika perlu.

Catatan Pengguna yang menjalankan TAEF harus menjadi anggota grup administrator untuk menjalankan perlengkapan yang ditandai dengan RunFixtureAs=Elevated. Hal ini disebabkan oleh fakta bahwa non-administrator tidak memiliki token terpisah untuk ditingkatkan.

Default
TAEF menjalankan perlengkapan dalam konteks yang sama dengan Te.exe (tetapi masih dalam proses yang berbeda dari pengujian).

Broker
TAEF menjalankan perlengkapan dalam proses 'Immersive Broker'.

Catatan  

  • 'Broker' hanya didukung pada Windows 8 dan sistem operasi yang lebih tinggi.
  • Kebijakan penandatanganan pengujian harus diaktifkan pada sistem. Untuk informasi selengkapnya, Opsi Konfigurasi Boot TESTSIGNING.
  • Menjalankan pengujian dari jarak jauh dengan 'RunFixtureAs=Broker' saat ini tidak didukung.
  • Saat menjalankan dengan TAEF 'RunFixtureAs=Broker' akan menggunakan proses "TE.ProcessHost.Broker.exe" untuk eksekusi fixture, bukan "TE.ProcessHost.exe".

UIAccess
TAEF menjalankan perlengkapan dalam proses yang ditandai dengan tingkat eksekusi UIAccess. Untuk informasi tentang UIAccess untuk aplikasi otomatisasi UI, lihat Desain Mekanisme Integritas Windows.

Catatan  

  • UIAccess hanya didukung pada Vista dan sistem operasi yang lebih tinggi.
  • Biner TAEF harus berjalan dari folder di bawah folder Program Files pada komputer.
  • Menjalankan pengujian dari jarak jauh dengan 'RunFixtureAs=UIAccess' saat ini tidak didukung.
  • Saat menjalankan dengan TAEF 'RunFixtureAs=UIAccess' akan menggunakan proses "TE.ProcessHost.UIAccess.exe" untuk eksekusi fikstur, bukan "TE.ProcessHost.exe".

Tes
TAEF menjalankan perlengkapan dalam proses atau konteks yang sama dengan pengujian.

Catatan Ini adalah perilaku TAEF default ketika tidak ada pengaturan RunFixtureAs yang ditentukan.

RunFixtureAs:[cakupan]

TAEF mendukung nilai RunFixtureAs:[scope] berikut, yang ditentukan oleh metadata pengujian.

RunFixtureAs:Module, RunFixtureAs:Assembly, atau RunFixtureAs:Dll
Nilai RunFixtureAs hanya akan berlaku untuk simpul tingkat Modul dalam hierarki pengujian.

RunFixtureAs:Class
Nilai RunFixtureAs hanya akan berlaku untuk node tingkat Kelas dalam hierarki pengujian.

RunFixtureAs:Method atau RunFixtureAs:Test
Nilai RunFixtureAs hanya akan berlaku untuk node Tingkat pengujian dalam hierarki pengujian.

Menandai Pengujian dengan 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);
};

Contoh sebelumnya akan menjalankan pengujian dan perlengkapan sebagai berikut:

  • MyTestMethod berjalan sebagai Sistem
  • MyTestSetup dan MyTestCleanup berjalan sebagai Ditingkatkan
  • MyClassSetup dan MyClassCleanup berjalan sebagai Sistem (dalam proses yang sama dengan MyTestMethod)
  • MyModuleSetup dan MyModuleCleanup berjalan sebagai Sistem (dalam proses yang sama dengan 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);
};

Contoh sebelumnya akan menjalankan pengujian dan perlengkapan sebagai berikut:

  • MyTestMethod berjalan sebagai Sistem
  • MyTestSetup dan MyTestCleanup berjalan sebagai Ditingkatkan
  • MyClassSetup dan MyClassCleanup berjalan sebagai Elevated
  • MyModuleSetup dan MyModuleCleanup berjalan sebagai Sistem (dalam proses yang sama dengan 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);
};

Contoh sebelumnya akan menjalankan pengujian dan perlengkapan sebagai berikut:

  • MyTestMethod berjalan sebagai Terbatas
  • MyTestSetup dan MyTestCleanup berjalan sebagai Ditingkatkan
  • MyClassSetup dan MyClassCleanup berjalan sebagai Sistem
  • MyModuleSetup dan MyModuleCleanup berjalan sebagai Terbatas (dalam proses yang sama dengan 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);
};

Contoh sebelumnya akan menjalankan pengujian dan perlengkapan sebagai berikut:

  • MyTestMethod berjalan sebagai Sistem
  • MyTestMethod2 berjalan sebagai Terbatas
  • MyTestSetup dan MyTestCleanup berjalan sebagai Ditingkatkan; Pencakupan RunFixtureAs:Test diterapkan ke semua metode pengujian dalam kelas MyTests
  • MyClassSetup dan MyClassCleanup berjalan sebagai Sistem (dalam proses yang berbeda dari MyTestMethod)
  • MyModuleSetup dan MyModuleCleanup berjalan seperti dalam konteks proses pengujian masing-masing (System for MyTestMethod dan 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);
};

Contoh sebelumnya akan menjalankan pengujian dan perlengkapan sebagai berikut:

  • MyTestMethod berjalan sebagai Sistem
  • MyTestMethod2 berjalan sebagai Terbatas
  • MyTestSetup dan MyTestCleanup berjalan sebagai Sistem untuk MyTestMethod dan sebagai Ditingkatkan untuk MyTestMethod2
  • MyClassSetup dan MyClassCleanup berjalan sebagai Sistem (dalam proses yang berbeda dari MyTestMethod)
  • MyModuleSetup dan MyModuleCleanup berjalan seperti dalam konteks proses pengujian masing-masing (System for MyTestMethod dan 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);
};

Contoh sebelumnya akan menjalankan pengujian dan perlengkapan sebagai berikut:

  • MyTestMethod berjalan sebagai Sistem
  • MyTestMethod2 berjalan sebagai Terbatas
  • MyTestSetup dan MyTestCleanup berjalan sebagai Ditingkatkan untuk MyTestMethod dan MyTestMethod2
  • MyClassSetup dan MyClassCleanup berjalan sebagai Default (dalam konteks yang sama dengan Te.exe saat ini berjalan, namun dalam proses yang berbeda dari MyTestMethod dan MyTestMethod2)
  • MyModuleSetup dan MyModuleCleanup berjalan sebagai Sistem (dalam proses yang berbeda dari 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);
};

Contoh sebelumnya akan menjalankan pengujian dan perlengkapan sebagai berikut:

  • MyTestMethod berjalan sebagai Sistem
  • MyTestMethod2 berjalan sebagai Terbatas
  • MyTestSetup dan MyTestCleanup berjalan dalam proses yang sama dengan MyTestMethod dan MyTestMethod2
  • MyClassSetup dan MyClassCleanup berjalan sebagai Elevated
  • MyModuleSetup dan MyModuleCleanup berjalan sebagai Sistem (dalam proses yang berbeda dari 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);
};

Contoh sebelumnya akan menjalankan pengujian dan perlengkapan sebagai berikut:

  • MyTestMethod berjalan sebagai Sistem
  • MyTestMethod2 berjalan sebagai Terbatas
  • MyTestSetup dan MyTestCleanup berjalan dalam proses yang sama dengan MyTestMethod dan dalam proses yang ditingkatkan untuk MyTestMethod2
  • MyClassSetup dan MyClassCleanup berjalan sebagai Ditingkatkan
  • MyModuleSetup dan MyModuleCleanup berjalan sebagai Sistem (dalam proses yang berbeda dari 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);
};

Contoh di atas akan menjalankan pengujian dan perlengkapan sebagai berikut:

  • MyTestMethod berjalan sebagai Sistem
  • MyTestMethod2 berjalan sebagai Terbatas
  • MyTestSetup dan MyTestCleanup berjalan sebagai Sistem (dalam proses yang berbeda dari MyTestMethod)
  • MyClassSetup dan MyClassCleanup berjalan sebagai Ditingkatkan
  • MyModuleSetup dan MyModuleCleanup berjalan sebagai Sistem (dalam proses yang berbeda dari MyTestMethod)