Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menjelaskan cara membuat kerangka kerja pengujian kustom untuk Microsoft.Testing.Platform. Kerangka kerja pengujian adalah satu-satunya ekstensi wajib. Ini menemukan dan menjalankan pengujian, dan melaporkan hasil kembali ke platform.
Untuk ringkasan titik ekstensi lengkap dan konsep dalam proses/di luar proses, lihat Membuat ekstensi kustom.
Jika Anda memigrasikan kerangka kerja pengujian berbasis VSTest yang ada, mengimplementasikan ITestFramework antarmuka secara asli adalah pendekatan yang direkomendasikan. Ekstensi VsTest Bridge tersedia sebagai langkah transisi, tetapi implementasi asli memberikan pengalaman terbaik.
Ekstensi kerangka kerja pengujian
Kerangka kerja pengujian adalah ekstensi utama yang menyediakan platform pengujian dengan kemampuan untuk menemukan dan menjalankan pengujian. Kerangka kerja pengujian bertanggung jawab untuk mengkomunikasikan hasil pengujian kembali ke platform pengujian. Kerangka kerja pengujian adalah satu-satunya ekstensi wajib yang diperlukan untuk menjalankan sesi pengujian.
Mendaftarkan kerangka kerja pengujian
Bagian ini menjelaskan cara mendaftarkan kerangka kerja pengujian dengan platform pengujian. Anda hanya mendaftarkan satu kerangka kerja pengujian per pembuat aplikasi pengujian menggunakan API seperti yang TestApplication.RegisterTestFramework ditunjukkan dalam dokumentasi arsitektur Microsoft.Testing.Platform .
API pendaftaran didefinisikan sebagai berikut:
ITestApplicationBuilder RegisterTestFramework(
Func<IServiceProvider, ITestFrameworkCapabilities> capabilitiesFactory,
Func<ITestFrameworkCapabilities, IServiceProvider, ITestFramework> adapterFactory);
RegisterTestFramework API mengharapkan dua pabrik:
Func<IServiceProvider, ITestFrameworkCapabilities>: Ini adalah delegasi yang menerima objek yang mengimplementasikanIServiceProviderantarmuka dan mengembalikan objek yang mengimplementasikanITestFrameworkCapabilitiesantarmuka.IServiceProvidermenyediakan akses ke layanan platform seperti konfigurasi, pencatatan, dan argumen baris perintah.Antarmuka
ITestFrameworkCapabilitiesdigunakan untuk mengumumkan kemampuan yang didukung oleh kerangka kerja pengujian ke platform dan ekstensi. Ini memungkinkan platform dan ekstensi untuk berinteraksi dengan benar dengan menerapkan dan mendukung perilaku tertentu. Untuk pemahaman yang lebih baik tentang konsep kemampuan, lihat bagian masing-masing.Func<ITestFrameworkCapabilities, IServiceProvider, ITestFramework>: Ini adalah delegasi yang menerima objek ITestFrameworkCapabilities, yang merupakan instance yang dikembalikan olehFunc<IServiceProvider, ITestFrameworkCapabilities>, dan IServiceProvider untuk menyediakan akses ke layanan platform sekali lagi. Objek pengembalian yang diharapkan adalah objek yang mengimplementasikan antarmuka ITestFramework .ITestFrameworkberfungsi sebagai mesin eksekusi yang menemukan dan menjalankan pengujian, kemudian mengkomunikasikan hasilnya kembali ke platform pengujian.
Kebutuhan platform untuk memisahkan pembuatan ITestFrameworkCapabilities dan pembuatan ITestFramework adalah pengoptimalan untuk menghindari pembuatan kerangka kerja pengujian jika kemampuan yang didukung tidak cukup untuk menjalankan sesi pengujian saat ini.
Pertimbangkan contoh kode pengguna berikut, yang menunjukkan pendaftaran kerangka kerja pengujian yang mengembalikan set kemampuan kosong:
internal class TestingFrameworkCapabilities : ITestFrameworkCapabilities
{
public IReadOnlyCollection<ITestFrameworkCapability> Capabilities => [];
}
internal class TestingFramework : ITestFramework
{
public TestingFramework(ITestFrameworkCapabilities capabilities, IServiceProvider serviceProvider)
{
// ...
}
// Omitted for brevity...
}
public static class TestingFrameworkExtensions
{
public static void AddTestingFramework(this ITestApplicationBuilder builder)
{
builder.RegisterTestFramework(
_ => new TestingFrameworkCapabilities(),
(capabilities, serviceProvider) => new TestingFramework(capabilities, serviceProvider));
}
}
// ...
Sekarang, pertimbangkan titik masuk yang sesuai dari contoh ini dengan kode pendaftaran:
var testApplicationBuilder = await TestApplication.CreateBuilderAsync(args);
// Register the testing framework
testApplicationBuilder.AddTestingFramework();
using var testApplication = await testApplicationBuilder.BuildAsync();
return await testApplication.RunAsync();
Nota
Mengembalikan ITestFrameworkCapabilities kosong seharusnya tidak mencegah eksekusi sesi pengujian. Semua kerangka kerja pengujian harus mampu menemukan dan menjalankan pengujian. Dampaknya harus terbatas pada ekstensi yang mungkin menolak jika kerangka kerja pengujian tidak memiliki fitur tertentu.
Membuat kerangka kerja pengujian
diimplementasikan Microsoft.Testing.Platform.Extensions.TestFramework.ITestFramework oleh ekstensi yang menyediakan kerangka kerja pengujian:
public interface ITestFramework : IExtension
{
Task<CreateTestSessionResult> CreateTestSessionAsync(CreateTestSessionContext context);
Task ExecuteRequestAsync(ExecuteRequestContext context);
Task<CloseTestSessionResult> CloseTestSessionAsync(CloseTestSessionContext context);
}
Antarmuka IExtension
Antarmuka ITestFramework adalah turunan dari antarmuka IExtension, yang merupakan antarmuka dasar yang dipakai oleh semua titik ekstensi.
IExtension digunakan untuk mengambil nama dan deskripsi ekstensi. juga IExtension menyediakan cara untuk mengaktifkan atau menonaktifkan ekstensi secara dinamis dalam penyiapan, melalui Task<bool> IsEnabledAsync(). Pastikan Anda mengembalikan true dari metode ini tanpa persyaratan khusus yang mengharuskan menonaktifkannya.
Metode CreateTestSessionAsync
Metode CreateTestSessionAsync ini dipanggil pada awal sesi pengujian dan digunakan untuk menginisialisasi kerangka kerja pengujian. API menerima CreateTestSessionContext objek dan mengembalikan CreateTestSessionResult.
public sealed class CreateTestSessionContext : TestSessionContext
{
public CancellationToken CancellationToken { get; }
}
Properti SessionUid diwariskan dari TestSessionContext (lihat bagian TestSessionContext).
CancellationToken digunakan untuk menghentikan eksekusi CreateTestSessionAsync.
Objek pengembalian adalah CreateTestSessionResult:
public sealed class CreateTestSessionResult
{
public string? WarningMessage { get; set; }
public string? ErrorMessage { get; set; }
public bool IsSuccess { get; set; }
}
Properti IsSuccess digunakan untuk menunjukkan apakah pembuatan sesi berhasil. Ketika mengembalikan false, eksekusi pengujian dihentikan.
Metode CloseTestSessionAsync
Metode CloseTestSessionAsync ini disandingkan dengan CreateTestSessionAsync fungsionalitas, dengan satu-satunya perbedaan adalah nama objek. Untuk informasi selengkapnya, lihat bagian CreateTestSessionAsync .
Metode ExecuteRequestAsync
Metode ExecuteRequestAsync menerima objek jenis ExecuteRequestContext. Objek ini, seperti yang disarankan oleh namanya, menyimpan spesifikasi tentang tindakan yang diharapkan dilakukan kerangka kerja pengujian.
Definisi dari ExecuteRequestContext adalah:
public sealed class ExecuteRequestContext
{
public IRequest Request { get; }
public IMessageBus MessageBus { get; }
public CancellationToken CancellationToken { get; }
public void Complete();
}
IRequest: Ini adalah antarmuka dasar untuk semua jenis permintaan. Anda harus memikirkan kerangka kerja pengujian sebagai server stateful dalam-proses di mana siklus hidupnya adalah:
Diagram sebelumnya menggambarkan bahwa platform pengujian mengeluarkan tiga permintaan setelah membuat instans kerangka kerja pengujian. Kerangka kerja pengujian memproses permintaan ini dan menggunakan IMessageBus layanan, yang disertakan dalam permintaan itu sendiri, untuk memberikan hasil untuk setiap permintaan tertentu. Setelah permintaan tertentu ditangani, kerangka kerja pengujian memanggil metode Complete() di atasnya, menunjukkan bahwa permintaan telah dipenuhi kepada platform pengujian.
Platform pengujian memantau semua permintaan yang dikirim. Setelah semua permintaan terpenuhi, sistem akan memanggil CloseTestSessionAsync dan membuang instans (jika IDisposable/IAsyncDisposable diimplementasikan).
Terbukti bahwa permintaan dan penyelesaiannya dapat tumpang tindih, memungkinkan eksekusi permintaan secara bersamaan dan asinkron.
Nota
Saat ini, platform pengujian tidak mengirim permintaan yang tumpang tindih dan menunggu penyelesaian permintaan sebelum mengirim permintaan >> berikutnya. Namun, perilaku ini dapat berubah di masa depan. Dukungan untuk permintaan bersamaan akan ditentukan melalui sistem kemampuan .
Implementasi IRequest menentukan permintaan yang tepat yang perlu dipenuhi. Kerangka kerja pengujian mengidentifikasi jenis permintaan dan menanganinya dengan sesuai. Jika jenis permintaan tidak dikenali, pengecualian harus dinaikkan.
Anda dapat menemukan detail tentang permintaan yang tersedia di bagian IRequest .
IMessageBus: Layanan ini, yang ditautkan dengan permintaan, memungkinkan kerangka kerja pengujian untuk secara asinkron menerbitkan informasi tentang permintaan yang sedang berlangsung ke platform pengujian.
Bus pesan berfungsi sebagai hub pusat untuk platform, memfasilitasi komunikasi asinkron di antara semua komponen dan ekstensi platform.
Untuk daftar informasi komprehensif yang dapat diterbitkan ke platform pengujian, lihat bagian IMessageBus .
CancellationToken: Token ini digunakan untuk mengganggu pemrosesan permintaan tertentu.
Complete(): Seperti yang digambarkan dalam urutan sebelumnya, Complete metode memberi tahu platform bahwa permintaan telah berhasil diproses dan semua informasi yang relevan telah ditransmisikan ke IMessageBus.
Peringatan
Mengabaikan untuk memanggil Complete() pada permintaan akan mengakibatkan aplikasi pengujian menjadi tidak responsif.
Untuk menyesuaikan kerangka kerja pengujian sesuai dengan kebutuhan atau pengguna, Anda dapat menggunakan bagian yang dipersonalisasi di dalam file konfigurasi atau dengan opsi baris perintah kustom.
Menangani permintaan
Bagian berikutnya memberikan deskripsi terperinci tentang berbagai permintaan yang mungkin diterima dan diproses oleh kerangka kerja pengujian.
Sebelum melanjutkan ke bagian berikutnya, sangat penting untuk memahami konsep IMessageBus secara menyeluruh, yang merupakan layanan penting untuk menyampaikan informasi eksekusi pengujian ke platform pengujian.
TestSessionContext
TestSessionContext adalah properti bersama di semua permintaan, memberikan informasi tentang sesi pengujian yang sedang berlangsung:
public class TestSessionContext
{
public SessionUid SessionUid { get; }
}
public readonly struct SessionUid(string value)
{
public string Value { get; }
}
TestSessionContext terdiri dari SessionUid, pengidentifikasi unik untuk sesi pengujian yang sedang berlangsung yang membantu dalam pengelogan dan menghubungkan data sesi pengujian.
DiscoverTestExecutionRequest
public class DiscoverTestExecutionRequest
{
public TestSessionContext Session { get; }
public ITestExecutionFilter Filter { get; }
}
Kerangka kerja pengujian DiscoverTestExecutionRequest menginstruksikan untuk menemukan pengujian dan mengomunikasikan informasi ini dengan cara yang dipikirkan ke IMessageBus.
Seperti yang diuraikan di bagian sebelumnya, properti untuk pengujian yang ditemukan adalah DiscoveredTestNodeStateProperty. Berikut adalah cuplikan kode generik untuk referensi:
var testNode = new TestNode
{
Uid = GenerateUniqueStableId(),
DisplayName = GetDisplayName(),
Properties = new PropertyBag(
DiscoveredTestNodeStateProperty.CachedInstance),
};
await context.MessageBus.PublishAsync(
this,
new TestNodeUpdateMessage(
discoverTestExecutionRequest.Session.SessionUid,
testNode));
// ...
JalankanPermintaanEksekusiTes
public class RunTestExecutionRequest
{
public TestSessionContext Session { get; }
public ITestExecutionFilter Filter { get; }
}
Kerangka kerja
Berikut adalah cuplikan kode generik untuk referensi:
var skippedTestNode = new TestNode()
{
Uid = GenerateUniqueStableId(),
DisplayName = GetDisplayName(),
Properties = new PropertyBag(
SkippedTestNodeStateProperty.CachedInstance),
};
await context.MessageBus.PublishAsync(
this,
new TestNodeUpdateMessage(
runTestExecutionRequest.Session.SessionUid,
skippedTestNode));
// ...
var successfulTestNode = new TestNode()
{
Uid = GenerateUniqueStableId(),
DisplayName = GetDisplayName(),
Properties = new PropertyBag(
PassedTestNodeStateProperty.CachedInstance),
};
await context.MessageBus.PublishAsync(
this,
new TestNodeUpdateMessage(
runTestExecutionRequest.Session.SessionUid,
successfulTestNode));
// ...
var assertionFailedTestNode = new TestNode()
{
Uid = GenerateUniqueStableId(),
DisplayName = GetDisplayName(),
Properties = new PropertyBag(
new FailedTestNodeStateProperty(assertionException)),
};
await context.MessageBus.PublishAsync(
this,
new TestNodeUpdateMessage(
runTestExecutionRequest.Session.SessionUid,
assertionFailedTestNode));
// ...
var failedTestNode = new TestNode()
{
Uid = GenerateUniqueStableId(),
DisplayName = GetDisplayName(),
Properties = new PropertyBag(
new ErrorTestNodeStateProperty(ex.InnerException!)),
};
await context.MessageBus.PublishAsync(
this,
new TestNodeUpdateMessage(
runTestExecutionRequest.Session.SessionUid,
failedTestNode));
Data TestNodeUpdateMessage
Seperti disebutkan di bagian IMessageBus , sebelum menggunakan bus pesan, Anda harus menentukan jenis data yang ingin Anda berikan. Platform pengujian telah mendefinisikan jenis terkenal, TestNodeUpdateMessage, untuk mewakili konsep pembaruan informasi pengujian.
Bagian dokumen ini akan menjelaskan cara menggunakan data payload ini. Mari kita periksa permukaannya:
public sealed class TestNodeUpdateMessage(
SessionUid sessionUid,
TestNode testNode,
TestNodeUid? parentTestNodeUid = null)
{
public TestNode TestNode { get; }
public TestNodeUid? ParentTestNodeUid { get; }
}
public class TestNode
{
public required TestNodeUid Uid { get; init; }
public required string DisplayName { get; init; }
public PropertyBag Properties { get; init; } = new();
}
public sealed class TestNodeUid(string value);
public sealed partial class PropertyBag
{
public PropertyBag();
public PropertyBag(params IProperty[] properties);
public PropertyBag(IEnumerable<IProperty> properties);
public int Count { get; }
public void Add(IProperty property);
public bool Any<TProperty>();
public TProperty? SingleOrDefault<TProperty>();
public TProperty Single<TProperty>();
public TProperty[] OfType<TProperty>();
public IEnumerable<IProperty> AsEnumerable();
public IEnumerator<IProperty> GetEnumerator();
...
}
public interface IProperty
{
}
TestNodeUpdateMessageTestNodeUpdateMessage: Terdiri dari dua properti: aTestNodedanParentTestNodeUid.ParentTestNodeUidmenunjukkan bahwa tes mungkin memiliki tes induk, memperkenalkan konsep pohon tes di manaTestNodedapat diatur dalam kaitannya satu sama lain. Struktur ini memungkinkan peningkatan dan fitur di masa mendatang berdasarkan hubungan pohon antara simpul. Jika kerangka kerja pengujian Anda tidak memerlukan struktur pohon uji, Anda dapat memilih untuk tidak menggunakannya dan hanya mengaturnya menjadi null, menghasilkan daftarTestNodedatar yang mudah.TestNodeTestNode: terdiri dari tiga properti, salah satunya adalahUidjenisTestNodeUid. IniUidberfungsi sebagai ID UNIK STABIL untuk simpul. Istilah UNIQUE STABLE ID menyiratkan bahwaTestNodeyang sama harus tetap memiliki IDENTICALUiddalam eksekusi dan sistem operasi yang berbeda.TestNodeUidadalah string buram arbitrer yang diterima platform pengujian apa adanya.
Penting
Stabilitas dan keunikan ID sangat penting dalam domain pengujian. Memungkinkan penargetan yang tepat untuk satu pengujian agar dapat dijalankan, dan memungkinkan ID berfungsi sebagai pengidentifikasi persisten untuk pengujian, sehingga mendukung pengembangan ekstensi dan fitur yang lebih canggih.
Properti kedua adalah DisplayName, yang merupakan nama yang mudah dipahami oleh manusia untuk tes. Misalnya, nama ini ditampilkan saat Anda menjalankan --list-tests baris perintah.
Atribut ketiga adalah Properties, yang merupakan PropertyBag jenis. Seperti yang ditunjukkan dalam kode, ini adalah kantong properti khusus yang menyimpan properti generik tentang TestNodeUpdateMessage. Ini menyiratkan bahwa Anda dapat menambahkan properti apa pun ke node yang mengimplementasikan antarmuka placeholder IProperty.
Platform pengujian mengidentifikasi properti tertentu yang TestNode.Properties ditambahkan ke untuk menentukan apakah pengujian telah lulus, gagal, atau telah dilewati.
Anda dapat menemukan daftar properti yang tersedia saat ini dengan deskripsi relatif di bagian TestNodeUpdateMessage.TestNode.
Jenis ini PropertyBag biasanya dapat diakses di setiap IData dan digunakan untuk menyimpan properti lain-lain yang dapat dikueri oleh platform dan ekstensi. Mekanisme ini memungkinkan kami untuk meningkatkan platform dengan informasi baru tanpa memperkenalkan perubahan yang merusak. Jika sebuah komponen mengenali properti, komponen dapat memeriksanya; jika tidak, komponen akan mengabaikannya.
Akhirnya bagian ini menjelaskan bahwa Anda menguji implementasi kerangka kerja perlu mengimplementasikan IDataProducer yang menghasilkan TestNodeUpdateMessageseperti dalam sampel di bawah ini:
internal sealed class TestingFramework
: ITestFramework, IDataProducer
{
// ...
public Type[] DataTypesProduced =>
[
typeof(TestNodeUpdateMessage)
];
// ...
}
Jika adaptor pengujian Anda memerlukan publikasi file selama eksekusi, Anda dapat menemukan properti yang dikenali dalam file sumber ini: https://github.com/microsoft/testfx/blob/main/src/Platform/Microsoft.Testing.Platform/Messages/FileArtifacts.cs. Seperti yang Anda lihat, Anda dapat menyediakan aset file secara umum atau mengaitkannya dengan TestNode. Ingat, jika Anda ingin mendorong SessionFileArtifact, Anda harus mendeklarasikannya ke platform terlebih dahulu, seperti yang ditunjukkan di bawah ini:
internal sealed class TestingFramework
: ITestFramework, IDataProducer
{
// ...
public Type[] DataTypesProduced =>
[
typeof(TestNodeUpdateMessage),
typeof(SessionFileArtifact)
];
// ...
}
Properti terkenal
Seperti yang dijelaskan di bagian permintaan, platform pengujian mengidentifikasi properti tertentu yang ditambahkan ke TestNodeUpdateMessage untuk menentukan status TestNode (misalnya, berhasil, gagal, dilewati, dll.). Ini memungkinkan runtime untuk secara akurat menampilkan daftar pengujian yang gagal dengan informasi yang sesuai di konsol, dan untuk mengatur kode keluar yang sesuai untuk proses pengujian.
Dalam segmen ini, kami akan menjelaskan berbagai opsi terkenal IProperty dan implikasinya masing-masing.
Untuk daftar lengkap properti terkenal, lihat TestNodeProperties.cs. Jika Anda melihat bahwa deskripsi properti hilang, silakan ajukan masalah.
Properti ini dapat dibagi dalam kategori berikut:
- Informasi Umum: Properti yang dapat disertakan dalam segala jenis permintaan.
-
Informasi penemuan: Properti yang disediakan selama
DiscoverTestExecutionRequestpermintaan penemuan. -
Informasi pelaksanaan: Properti yang disediakan selama permintaan pelaksanaan pengujian
RunTestExecutionRequest.
Properti tertentu diperlukan, sementara properti lain bersifat opsional. Properti wajib diperlukan untuk menyediakan fungsionalitas pengujian dasar, seperti melaporkan pengujian yang gagal dan menunjukkan apakah seluruh sesi pengujian berhasil atau tidak.
Properti opsional, di sisi lain, meningkatkan pengalaman pengujian dengan memberikan informasi tambahan. Mereka sangat berguna dalam skenario IDE (seperti VS, VSCode, dll.), eksekusi konsol, atau ketika mendukung ekstensi tertentu yang memerlukan informasi yang lebih rinci untuk berfungsi dengan benar. Namun, properti opsional ini tidak memengaruhi eksekusi pengujian.
Nota
Ekstensi ditugaskan untuk memberi tahu dan mengelola pengecualian saat memerlukan informasi tertentu untuk beroperasi dengan benar. Jika ekstensi tidak memiliki informasi yang diperlukan, itu seharusnya tidak menyebabkan eksekusi pengujian gagal, melainkan cukup memilih untuk tidak ikut serta.
Informasi umum
public record KeyValuePairStringProperty(
string Key,
string Value)
: IProperty;
KeyValuePairStringProperty merupakan data pasangan kunci/nilai umum.
public record struct LinePosition(
int Line,
int Column);
public record struct LinePositionSpan(
LinePosition Start,
LinePosition End);
public abstract record FileLocationProperty(
string FilePath,
LinePositionSpan LineSpan)
: IProperty;
public sealed record TestFileLocationProperty(
string FilePath,
LinePositionSpan LineSpan)
: FileLocationProperty(FilePath, LineSpan);
TestFileLocationProperty digunakan untuk menentukan lokasi pengujian dalam file sumber. Ini sangat berguna ketika inisiator adalah IDE seperti Visual Studio atau Visual Studio Code.
public sealed record TestMethodIdentifierProperty(
string AssemblyFullName,
string Namespace,
string TypeName,
string MethodName,
string[] ParameterTypeFullNames,
string ReturnTypeFullName)
TestMethodIdentifierProperty adalah pengidentifikasi unik untuk metode pengujian.
public sealed record TestMetadataProperty(
string Key,
string Value)
TestMetadataProperty digunakan untuk menyampaikan karakteristik atau sifat dari TestNode.
Informasi penemuan
public sealed record DiscoveredTestNodeStateProperty(
string? Explanation = null)
{
public static DiscoveredTestNodeStateProperty CachedInstance { get; }
}
DiscoveredTestNodeStateProperty menunjukkan bahwa TestNode ini telah ditemukan. Ini digunakan ketika DiscoverTestExecutionRequest dikirim ke kerangka kerja pengujian.
Perhatikan nilai cache yang berguna yang ditawarkan oleh properti CachedInstance.
Properti ini diperlukan.
Informasi Pelaksanaan
public sealed record InProgressTestNodeStateProperty(
string? Explanation = null)
{
public static InProgressTestNodeStateProperty CachedInstance { get; }
}
Pihak InProgressTestNodeStateProperty menginformasikan platform pengujian bahwa TestNode telah dijadwalkan untuk dieksekusi dan saat ini sedang berlangsung.
Perhatikan nilai cache yang berguna yang ditawarkan oleh properti CachedInstance.
public readonly record struct TimingInfo(
DateTimeOffset StartTime,
DateTimeOffset EndTime,
TimeSpan Duration);
public sealed record StepTimingInfo(
string Id,
string Description,
TimingInfo Timing);
public sealed record TimingProperty : IProperty
{
public TimingProperty(TimingInfo globalTiming)
: this(globalTiming, [])
{
}
public TimingProperty(
TimingInfo globalTiming,
StepTimingInfo[] stepTimings)
{
GlobalTiming = globalTiming;
StepTimings = stepTimings;
}
public TimingInfo GlobalTiming { get; }
public StepTimingInfo[] StepTimings { get; }
}
TimingProperty digunakan untuk menyampaikan detail waktu tentang TestNode eksekusi. Ini juga memungkinkan penjadwalan waktu langkah eksekusi secara individual melalui StepTimingInfo. Ini sangat berguna ketika konsep pengujian Anda dibagi menjadi beberapa fase seperti inisialisasi, eksekusi, dan pembersihan.
Satu dan hanya satu dari properti berikut yang diperlukan per TestNode dan mengkomunikasikan hasil dari TestNode ke platform pengujian.
public sealed record PassedTestNodeStateProperty(
string? Explanation = null)
: TestNodeStateProperty(Explanation)
{
public static PassedTestNodeStateProperty CachedInstance
{ get; } = new PassedTestNodeStateProperty();
}
PassedTestNodeStateProperty menginformasikan platform pengujian bahwa TestNode ini lolos.
Perhatikan nilai cache yang berguna yang ditawarkan oleh properti CachedInstance.
public sealed record SkippedTestNodeStateProperty(
string? Explanation = null)
: TestNodeStateProperty(Explanation)
{
public static SkippedTestNodeStateProperty CachedInstance
{ get; } = new SkippedTestNodeStateProperty();
}
SkippedTestNodeStateProperty menginformasikan platform pengujian bahwa TestNode telah dilewati.
Perhatikan nilai cache yang berguna yang ditawarkan oleh properti CachedInstance.
public sealed record FailedTestNodeStateProperty : TestNodeStateProperty
{
public FailedTestNodeStateProperty()
: base(default(string))
{
}
public FailedTestNodeStateProperty(string explanation)
: base(explanation)
{
}
public FailedTestNodeStateProperty(
Exception exception,
string? explanation = null)
: base(explanation ?? exception.Message)
{
Exception = exception;
}
public Exception? Exception { get; }
}
FailedTestNodeStateProperty menginformasikan platform pengujian bahwa TestNode ini mengalami kegagalan setelah asersi.
public sealed record ErrorTestNodeStateProperty : TestNodeStateProperty
{
public ErrorTestNodeStateProperty()
: base(default(string))
{
}
public ErrorTestNodeStateProperty(string explanation)
: base(explanation)
{
}
public ErrorTestNodeStateProperty(
Exception exception,
string? explanation = null)
: base(explanation ?? exception.Message)
{
Exception = exception;
}
public Exception? Exception { get; }
}
ErrorTestNodeStateProperty menginformasikan platform pengujian bahwa ini TestNode telah gagal. Jenis kegagalan ini berbeda dari FailedTestNodeStateProperty, yang digunakan untuk kegagalan pernyataan. Misalnya, Anda dapat melaporkan masalah seperti kesalahan inisialisasi pengujian dengan ErrorTestNodeStateProperty.
public sealed record TimeoutTestNodeStateProperty : TestNodeStateProperty
{
public TimeoutTestNodeStateProperty()
: base(default(string))
{
}
public TimeoutTestNodeStateProperty(string explanation)
: base(explanation)
{
}
public TimeoutTestNodeStateProperty(
Exception exception,
string? explanation = null)
: base(explanation ?? exception.Message)
{
Exception = exception;
}
public Exception? Exception { get; }
public TimeSpan? Timeout { get; init; }
}
TimeoutTestNodeStateProperty menginformasikan platform pengujian bahwa TestNode telah gagal karena alasan waktu habis. Anda dapat melaporkan batas waktu menggunakan Timeout properti .
public sealed record CancelledTestNodeStateProperty : TestNodeStateProperty
{
public CancelledTestNodeStateProperty()
: base(default(string))
{
}
public CancelledTestNodeStateProperty(string explanation)
: base(explanation)
{
}
public CancelledTestNodeStateProperty(
Exception exception,
string? explanation = null)
: base(explanation ?? exception.Message)
{
Exception = exception;
}
public Exception? Exception { get; }
}
CancelledTestNodeStateProperty menginformasikan platform pengujian bahwa TestNode telah gagal karena pembatalan.