Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makale, microsoft.testing.platform için test çerçevesinin ötesindeki genişletilebilirlik noktalarını kapsar. Test çerçevesi oluşturmak için bkz. Test çerçevesi oluşturma.
Tam uzantı noktası özeti ve işlem içi/işlem dışı kavramlar için bkz. Özel uzantılar oluşturma.
Genişletilebilirlik noktaları
Test platformu, platformun ve test çerçevesinin davranışını özelleştirmenize olanak sağlayan ek genişletilebilirlik noktaları sağlar. Bu genişletilebilirlik noktaları isteğe bağlıdır ve test deneyimini geliştirmek için kullanılabilir.
ICommandLineOptionsProvider uzantılar
Uyarı
Bu API genişletildiğinde, özel uzantı test konağı işleminin hem içinde hem de dışında bulunur.
Mimari bölümünde açıklandığı gibi, ilk adım, test çerçevesi ve uzantılarını kaydetmek amacıyla ITestApplicationBuilder bileşenini yaratmaktır.
var builder = await TestApplication.CreateBuilderAsync(args);
CreateBuilderAsync yöntemi adlı string[]bir dize dizisini (args) kabul eder. Bu bağımsız değişkenler, komut satırı seçeneklerini test platformunun tüm bileşenlerine (yerleşik bileşenler, test çerçeveleri ve uzantılar dahil) geçirmek ve davranışlarını özelleştirmek için kullanılabilir.
Genellikle, geçirilen bağımsız değişkenler standart Main(string[] args) yönteminde alınanlardır. Ancak, barındırma ortamı farklıysa, bağımsız değişkenlerin herhangi bir listesi sağlanabilir.
Bağımsız değişkenlerin başına çift tire eklenmelidir . Örneğin, --filter.
Test çerçevesi veya uzantı noktası gibi bir bileşen özel komut satırı seçenekleri sunmak isterse, arabirimini ICommandLineOptionsProvider uygulayarak bunu yapabilir. Bu uygulama daha sonra
builder.CommandLine.AddProvider(
static () => new CustomCommandLineOptions());
Sağlanan örnekte, CustomCommandLineOptions arabiriminin ICommandLineOptionsProvider bir uygulamasıdır, Bu arabirim aşağıdaki üyeleri ve veri türlerini içerir:
public interface ICommandLineOptionsProvider : IExtension
{
IReadOnlyCollection<CommandLineOption> GetCommandLineOptions();
Task<ValidationResult> ValidateOptionArgumentsAsync(
CommandLineOption commandOption,
string[] arguments);
Task<ValidationResult> ValidateCommandLineOptionsAsync(
ICommandLineOptions commandLineOptions);
}
public sealed class CommandLineOption
{
public string Name { get; }
public string Description { get; }
public ArgumentArity Arity { get; }
public bool IsHidden { get; }
// ...
}
public interface ICommandLineOptions
{
bool IsOptionSet(string optionName);
bool TryGetOptionArgumentList(
string optionName,
out string[]? arguments);
}
Gözlemlendiği gibi, ICommandLineOptionsProvider arabirimi, IExtension genişletir. Bu nedenle, diğer tüm uzantılarda olduğu gibi API'yi kullanarak etkinleştirmeyi veya devre dışı bırakmayı IExtension.IsEnabledAsync seçebilirsiniz.
ICommandLineOptionsProvider'nin yürütme sırası şöyledir:
Şimdi api'leri ve bunların ortalamasını inceleyelim:
ICommandLineOptionsProvider.GetCommandLineOptions(): Bu yöntem, bileşen tarafından sunulan tüm seçenekleri almak için kullanılır. Her CommandLineOption biri aşağıdaki özelliklerin belirtilmesi gerekir:
string name: Bu, kısa çizgi olmadan sunulan seçeneğin adıdır. Örneğin, filtre kullanıcılar tarafından --filter olarak kullanılabilir.
string description: Bu seçeneğin açıklamasıdır. Kullanıcılar --help öğesini uygulama oluşturucusuna bağımsız değişken olarak geçirdiğinde görüntülenecek.
ArgumentArity arity: Bir seçeneğin arity'si, bu seçenek veya komut belirtilirse geçirilebilen değerlerin sayısıdır. Mevcut kullanılabilir arilikler şunlardır:
-
Zero: Sıfır bağımsız değişken arity değerini temsil eder. -
ZeroOrOne: Sıfır veya bir bağımsız değişken sayısını temsil eder. -
ZeroOrMore: Sıfır veya daha fazla bağımsız değişken aritesini temsil eder. -
OneOrMore: Bir veya daha fazla bağımsız değişkenin arity'sini temsil eder. -
ExactlyOne: Tam olarak bir argüman arity'sini temsil eder.
Örnekler için System.CommandLine arity tablosuna bakın.
bool isHidden: Bu özellik, seçeneğin kullanılabilir olduğunu ancak çağrıldığında --help açıklamada görüntülenmeyeceğini bildirir.
ICommandLineOptionsProvider.ValidateOptionArgumentsAsync: Bu yöntem, kullanıcı tarafından sağlanan bağımsız değişkeni doğrulamak için kullanılır.
Örneğin, özel test çerçevemiz için paralellik derecesini temsil eden adlı --dop bir parametreniz varsa, kullanıcı girdisi --dop 0olabilir. Bu senaryoda, 0 değeri, 1 veya daha fazla paralellik derecesine sahip olması beklendiğinden geçersiz olacaktır. kullanarak ValidateOptionArgumentsAsync, ön doğrulama gerçekleştirebilir ve gerekirse bir hata iletisi döndürebilirsiniz.
Yukarıdaki örnek için olası bir uygulama olabilir:
public Task<ValidationResult> ValidateOptionArgumentsAsync(
CommandLineOption commandOption,
string[] arguments)
{
if (commandOption.Name == "dop")
{
if (!int.TryParse(arguments[0], out int dopValue) || dopValue <= 0)
{
return ValidationResult.InvalidTask("--dop must be a positive integer");
}
}
return ValidationResult.ValidTask;
}
ICommandLineOptionsProvider.ValidateCommandLineOptionsAsync: Bu yöntem son yöntem olarak çağrılır ve genel tutarlılık denetimi yapılmasına izin verir.
Örneğin, test çerçevemizin bir test sonucu raporu oluşturup bir dosyaya kaydetme özelliğine sahip olduğunu varsayalım. Bu özelliğe --generatereport seçeneği kullanılarak erişilir ve dosya adı --reportfilename myfile.rep ile belirtilir. Bu senaryoda, bir kullanıcı yalnızca dosya adı belirtmeden seçeneği sağlıyorsa --generatereport , rapor dosya adı olmadan oluşturulamadığından doğrulama başarısız olmalıdır.
Yukarıdaki örnek için olası bir uygulama olabilir:
public Task<ValidationResult> ValidateCommandLineOptionsAsync(ICommandLineOptions commandLineOptions)
{
bool generateReportEnabled = commandLineOptions.IsOptionSet(GenerateReportOption);
bool reportFileName = commandLineOptions.TryGetOptionArgumentList(ReportFilenameOption, out string[]? _);
return (generateReportEnabled || reportFileName) && !(generateReportEnabled && reportFileName)
? ValidationResult.InvalidTask("Both `--generatereport` and `--reportfilename` need to be provided simultaneously.")
: ValidationResult.ValidTask;
}
ValidateCommandLineOptionsAsync yöntemi, platformun kendisi tarafından ayrıştırılan bağımsız değişken bilgilerini almak için kullanılan ICommandLineOptions hizmetini sağladığını lütfen unutmayın.
ITestSessionLifetimeHandler uzantılar
ITestSessionLifeTimeHandler, test oturumundan önce ve sonra kodun yürütülmesini sağlayan bir işlem içi uzantıdır.
Özel bir ITestSessionLifeTimeHandler kaydetmek için aşağıdaki API'yi kullanın.
var builder = await TestApplication.CreateBuilderAsync(args);
// ...
builder.TestHost.AddTestSessionLifetimeHandle(
static serviceProvider => new CustomTestSessionLifeTimeHandler());
Fabrika, test platformu tarafından sunulan hizmet paketine erişim elde etmek için IServiceProvider kullanır.
Önemli
API'ler kaydedildikleri sırayla çağrıldıklarından kayıt sırası önemlidir.
Arabirim ITestSessionLifeTimeHandler aşağıdaki yöntemleri içerir:
public interface ITestSessionLifetimeHandler : ITestHostExtension
{
Task OnTestSessionStartingAsync(
SessionUid sessionUid,
CancellationToken cancellationToken);
Task OnTestSessionFinishingAsync(
SessionUid sessionUid,
CancellationToken cancellationToken);
}
public readonly struct SessionUid(string value)
{
public string Value { get; } = value;
}
public interface ITestHostExtension : IExtension
{
}
ITestSessionLifetimeHandler bir tür ITestHostExtension olup, tüm test host uzantıları için temel görevi görür. Diğer tüm uzantı noktaları gibi IExtension'dan da miras alır. Bu nedenle, diğer tüm uzantılarda olduğu gibi API'yi kullanarak etkinleştirmeyi veya devre dışı bırakmayı IExtension.IsEnabledAsync seçebilirsiniz.
Bu API için aşağıdaki ayrıntıları göz önünde bulundurun:
OnTestSessionStartingAsync: Bu yöntem, test oturumu başlamadan önce çağrılır ve geçerli test oturumu için opak bir tanımlayıcı sağlayan SessionUid nesnesini alır.
OnTestSessionFinishingAsync: Bu yöntem, test oturumu tamamlandıktan sonra çağrılır ve test çerçevesinin tüm testleri yürütmeyi tamamladığından ve tüm ilgili verileri platforma bildirdiğinden emin olur. Genellikle bu yöntemde uzantı, paylaşılan platform veri yolu'na özel varlıkları veya verileri iletmek için öğesini kullanır IMessageBus . Bu yöntem, test oturumunun tamamlandığını belirten herhangi bir özel işlem dışı uzantıya da işaret edebilir.
Son olarak, her iki API de uzantının uyması beklenen bir CancellationToken alır.
Uzantınız yoğun bir başlatma gerektiriyorsa ve async/await desenini kullanmanız gerekiyorsa, Async extension initialization and cleanup öğesine başvurabilirsiniz. Uzantı noktaları arasında durum paylaşmanız gerekiyorsa, bölümüne başvurabilirsiniz.
ITestApplicationLifecycleCallbacks uzantılar
ITestApplicationLifecycleCallbacks, kodun her şeyden önce yürütülmesini sağlayan bir işlem içi uzantıdır, test konağı varsayımsal ana hattının ilk satırına erişim sahibi olmak gibidir.
Özel bir ITestApplicationLifecycleCallbacks kaydetmek için aşağıdaki API'yi kullanın.
var builder = await TestApplication.CreateBuilderAsync(args);
// ...
builder.TestHost.AddTestApplicationLifecycleCallbacks(
static serviceProvider
=> new CustomTestApplicationLifecycleCallbacks());
Fabrika, test platformu tarafından sunulan hizmet paketine erişim elde etmek için IServiceProvider kullanır.
Önemli
API'ler kaydedildikleri sırayla çağrıldıklarından kayıt sırası önemlidir.
Arabirim ITestApplicationLifecycleCallbacks aşağıdaki yöntemleri içerir:
public interface ITestApplicationLifecycleCallbacks : ITestHostExtension
{
Task BeforeRunAsync(CancellationToken cancellationToken);
Task AfterRunAsync(
int exitCode,
CancellationToken cancellation);
}
public interface ITestHostExtension : IExtension
{
}
ITestApplicationLifecycleCallbacks bir tür ITestHostExtension olup, tüm test host uzantıları için temel görevi görür. Diğer tüm uzantı noktaları gibi IExtension'dan da miras alır. Bu nedenle, diğer tüm uzantılarda olduğu gibi API'yi kullanarak etkinleştirmeyi veya devre dışı bırakmayı IExtension.IsEnabledAsync seçebilirsiniz.
BeforeRunAsync: Bu yöntem, test konağı için ilk iletişim noktası görevi görür ve işlem içi uzantının bir özelliği yürütmesi için ilk fırsattır. Bir özellik her iki ortamda çalışacak şekilde tasarlandıysa genellikle ilgili işlem dışı uzantılarla bağlantı kurmak için kullanılır.
Örneğin, yerleşik kilitlenme dökümü özelliği hem işlem içi hem de işlemdışı uzantılardan oluşur ve bu yöntem uzantının işlem dışı bileşeniyle bilgi alışverişinde bulunmak için kullanılır.
AfterRunAsync: Bu yöntem, int ITestApplication.RunAsync()'den çıkmadan önceki son çağrıdır ve exit code sağlar. Yalnızca temizleme görevleri için ve ilgili işlem dışı uzantılara test ana bilgisayarının sonlandırılacağı bildirilmesi için kullanılmalıdır.
Son olarak, her iki API de uzantının uyması beklenen bir CancellationToken alır.
IDataConsumer uzantılar
IDataConsumer, test çerçevesi ve uzantıları tarafından IData'a gönderilen bilgilere abone olup bilgi alabilen işlem içi bir uzantıdır.
Bu uzantı noktası, geliştiricilerin bir test oturumu sırasında oluşturulan tüm bilgileri toplamasına ve işlemesine olanak sağladığından çok önemlidir.
Özel bir IDataConsumer kaydetmek için aşağıdaki API'yi kullanın.
var builder = await TestApplication.CreateBuilderAsync(args);
// ...
builder.TestHost.AddDataConsumer(
static serviceProvider => new CustomDataConsumer());
Fabrika, test platformu tarafından sunulan hizmet paketine erişim elde etmek için IServiceProvider kullanır.
Önemli
API'ler kaydedildikleri sırayla çağrıldıklarından kayıt sırası önemlidir.
Arabirim IDataConsumer aşağıdaki yöntemleri içerir:
public interface IDataConsumer : ITestHostExtension
{
Type[] DataTypesConsumed { get; }
Task ConsumeAsync(
IDataProducer dataProducer,
IData value,
CancellationToken cancellationToken);
}
public interface IData
{
string DisplayName { get; }
string? Description { get; }
}
IDataConsumer bir tür ITestHostExtension olup, tüm test host uzantıları için temel görevi görür. Diğer tüm uzantı noktaları gibi IExtension'dan da miras alır. Bu nedenle, diğer tüm uzantılarda olduğu gibi API'yi kullanarak etkinleştirmeyi veya devre dışı bırakmayı IExtension.IsEnabledAsync seçebilirsiniz.
DataTypesConsumed: Bu özellik, bu uzantının kullanmayı planladığı listenin Type bir listesini döndürür. öğesine karşılık gelir IDataProducer.DataTypesProduced. Özellikle, bir IDataConsumer, sorun olmadan farklı IDataProducer örneklerden kaynaklanan birden çok türe abone olabilir.
ConsumeAsync: Geçerli tüketicinin abone olduğu bir veri türüne veri gönderildiğinde, bu yöntem çalıştırılır. Veri yükünün IDataProducer üreticisi IData ve yükün kendisi hakkındaki ayrıntıları sağlamak için alır. Gördüğünüz gibi, IData genel bilgilendirici veriler içeren genel bir yer tutucu arabirimidir. Farklı türlerde IData gönderim yapabilme özelliği, tüketicinin doğru türe dönüştürebilmek ve belirli bilgilere erişebilmek için türün kendisine göre değiştirme yapması gerektiği anlamına gelir.
Bir test çerçevesi tarafından üretilenleri ayrıntılandırmak isteyen bir tüketicinin TestNodeUpdateMessage örnek uygulaması şöyle olabilir:
internal class CustomDataConsumer : IDataConsumer, IOutputDeviceDataProducer
{
public Type[] DataTypesConsumed => new[] { typeof(TestNodeUpdateMessage) };
...
public Task ConsumeAsync(
IDataProducer dataProducer,
IData value,
CancellationToken cancellationToken)
{
var testNodeUpdateMessage = (TestNodeUpdateMessage)value;
switch (testNodeUpdateMessage.TestNode.Properties.Single<TestNodeStateProperty>())
{
case InProgressTestNodeStateProperty _:
{
...
break;
}
case PassedTestNodeStateProperty _:
{
...
break;
}
case FailedTestNodeStateProperty failedTestNodeStateProperty:
{
...
break;
}
case SkippedTestNodeStateProperty _:
{
...
break;
}
...
}
return Task.CompletedTask;
}
...
}
Son olarak API, uzantının yerine getirmesi beklenen bir CancellationToken alır.
Önemli
Yükün doğrudan ConsumeAsync yöntemi içinde işlenmesi çok önemlidir.
IMessageBus, yürütmeyi test çerçevesiyle koordine ederek hem zaman uyumlu hem de zaman uyumsuz işlemeyi yönetebilir. Tüketim süreci tamamen zaman uyumsuz olsa da ve yazı anında IMessageBus.Push'ı engellemese de, bu durum gelecekteki gereksinimler doğrultusunda değişebilecek bir uygulama ayrıntısıdır. Ancak platform, bu yöntemin her zaman bir kez çağrılmasını sağlayarak karmaşık eşitleme gereksinimini ortadan kaldırır ve tüketicilerin ölçeklenebilirliğini yönetir.
Uyarı
Bileşik bir uzantı noktasında IDataConsumer'in, ITestHostProcessLifetimeHandler ile birlikte kullanıldığında, ITestSessionLifetimeHandler.OnTestSessionFinishingAsync yürütülmesinden sonra alınan tüm verileri göz ardı etmek çok önemlidir.
OnTestSessionFinishingAsync birikmiş verileri işlemek ve yeni bilgileri IMessageBus'a iletmek için son fırsattır, bu nedenle bu noktanın ötesinde tüketilen veriler uzantı tarafından kullanılamaz.
Uzantınız yoğun bir başlatma gerektiriyorsa ve async/await desenini kullanmanız gerekiyorsa, Async extension initialization and cleanup öğesine başvurabilirsiniz. Uzantı noktaları arasında durum paylaşmanız gerekiyorsa, bölümüne başvurabilirsiniz.
ITestHostEnvironmentVariableProvider uzantılar
ITestHostEnvironmentVariableProvider, test konağı için özel ortam değişkenleri oluşturmanıza olanak tanıyan işlem dışı bir uzantıdır. Bu tür bir genişletme noktasını kullanmak, mimari bölümünde ayrıntılı olarak açıklandığı gibi, test platformunun uygun ortam değişkenleriyle yeni bir konak başlatmasını sağlar.
Özel bir ITestHostEnvironmentVariableProvider kaydetmek için aşağıdaki API'yi kullanın.
var builder = await TestApplication.CreateBuilderAsync(args);
// ...
builder.TestHostControllers.AddEnvironmentVariableProvider(
static serviceProvider => new CustomEnvironmentVariableForTestHost());
Fabrika, test platformu tarafından sunulan hizmet paketine erişim elde etmek için IServiceProvider kullanır.
Önemli
API'ler kaydedildikleri sırayla çağrıldıklarından kayıt sırası önemlidir.
Arabirim ITestHostEnvironmentVariableProvider aşağıdaki yöntemleri ve türleri içerir:
public interface ITestHostEnvironmentVariableProvider : ITestHostControllersExtension, IExtension
{
Task UpdateAsync(IEnvironmentVariables environmentVariables);
Task<ValidationResult> ValidateTestHostEnvironmentVariablesAsync(
IReadOnlyEnvironmentVariables environmentVariables);
}
public interface IEnvironmentVariables : IReadOnlyEnvironmentVariables
{
void SetVariable(EnvironmentVariable environmentVariable);
void RemoveVariable(string variable);
}
public interface IReadOnlyEnvironmentVariables
{
bool TryGetVariable(
string variable,
[NotNullWhen(true)] out OwnedEnvironmentVariable? environmentVariable);
}
public sealed class OwnedEnvironmentVariable : EnvironmentVariable
{
public IExtension Owner { get; }
public OwnedEnvironmentVariable(
IExtension owner,
string variable,
string? value,
bool isSecret,
bool isLocked);
}
public class EnvironmentVariable
{
public string Variable { get; }
public string? Value { get; }
public bool IsSecret { get; }
public bool IsLocked { get; }
}
ITestHostEnvironmentVariableProvider, tüm ITestHostControllersExtension uzantıları için temel olarak hizmet veren bir türüdür. Diğer tüm uzantı noktaları gibi IExtension'dan da miras alır. Bu nedenle, diğer tüm uzantılarda olduğu gibi API'yi kullanarak etkinleştirmeyi veya devre dışı bırakmayı IExtension.IsEnabledAsync seçebilirsiniz.
Bu API'nin ayrıntılarını göz önünde bulundurun:
UpdateAsync: Bu güncelleme API'si, IEnvironmentVariables nesnesinin bir örneğini sağlar; bu nesne üzerinden SetVariable veya RemoveVariable yöntemlerini çağırabilirsiniz.
SetVariable kullanırken, aşağıdaki belirtimleri gerektiren EnvironmentVariable türünde bir nesne geçirmeniz gerektiğini unutmayın.
-
Variable: Ortam değişkeninin adı. -
Value: Ortam değişkeninin değeri. -
IsSecret: Bu, ortam değişkeninin hassas bilgiler içerip içermediğini ve bu bilgilerin günlüğe kaydedilmemesi veyaTryGetVariablearacılığıyla erişilebilir olmaması gerektiğini gösterir. -
IsLocked: Bu, diğerITestHostEnvironmentVariableProvideruzantıların bu değeri değiştirip değiştiremeyeceğini belirler.
ValidateTestHostEnvironmentVariablesAsync: Bu yöntem, kayıtlı UpdateAsync örneklerin ITestHostEnvironmentVariableProvider tüm yöntemleri çağrıldıktan sonra çağrılır. Ortam değişkenlerinin doğru kurulumunu doğrulamanıza olanak tanır.
IReadOnlyEnvironmentVariables'yü implement eden ve TryGetVariable nesne türü ile belirli ortam değişkeni bilgilerini almak için OwnedEnvironmentVariable yöntemini sağlayan bir nesne alır. Doğrulamadan sonra, hata nedenlerini içeren bir ValidationResult döndürür.
Uyarı
Test platformu varsayılan olarak SystemEnvironmentVariableProvider öğesini uygular ve kaydeder. Bu sağlayıcı tüm geçerli ortam değişkenlerini yükler. İlk kayıtlı sağlayıcı olarak, ilk olarak yürütülür ve diğer ITestHostEnvironmentVariableProvider tüm kullanıcı uzantıları için varsayılan ortam değişkenlerine erişim verir.
Uzantınız yoğun bir başlatma gerektiriyorsa ve async/await desenini kullanmanız gerekiyorsa, Async extension initialization and cleanup öğesine başvurabilirsiniz. Uzantı noktaları arasında durum paylaşmanız gerekiyorsa, bölümüne başvurabilirsiniz.
ITestHostProcessLifetimeHandler uzantılar
ITestHostProcessLifetimeHandler, test konağı işlemini dış açıdan gözlemlemenizi sağlayan işlem dışı bir uzantıdır. Bu, uzantınızın test altındaki kod tarafından kaynaklanabilecek olası kilitlenmelerden veya donmalardan etkilenmemesini sağlar. Bu uzantı noktasını kullanmak, mimari bölümünde ayrıntılı olarak açıklandığı gibi test platformunun yeni bir konak başlatmasını tetikler.
Özel bir ITestHostProcessLifetimeHandler kaydetmek için aşağıdaki API'yi kullanın.
var builder = await TestApplication.CreateBuilderAsync(args);
// ...
builder.TestHostControllers.AddProcessLifetimeHandler(
static serviceProvider => new CustomMonitorTestHost());
Fabrika, test platformu tarafından sunulan hizmet paketine erişim elde etmek için IServiceProvider kullanır.
Önemli
API'ler kaydedildikleri sırayla çağrıldıklarından kayıt sırası önemlidir.
Arabirim ITestHostProcessLifetimeHandler aşağıdaki yöntemleri içerir:
public interface ITestHostProcessLifetimeHandler : ITestHostControllersExtension
{
Task BeforeTestHostProcessStartAsync(CancellationToken cancellationToken);
Task OnTestHostProcessStartedAsync(
ITestHostProcessInformation testHostProcessInformation,
CancellationToken cancellation);
Task OnTestHostProcessExitedAsync(
ITestHostProcessInformation testHostProcessInformation,
CancellationToken cancellation);
}
public interface ITestHostProcessInformation
{
int PID { get; }
int ExitCode { get; }
bool HasExitedGracefully { get; }
}
ITestHostProcessLifetimeHandler, tüm ITestHostControllersExtension uzantıları için temel olarak hizmet veren bir türüdür. Diğer tüm uzantı noktaları gibi IExtension'dan da miras alır. Bu nedenle, diğer tüm uzantılarda olduğu gibi API'yi kullanarak etkinleştirmeyi veya devre dışı bırakmayı IExtension.IsEnabledAsync seçebilirsiniz.
Bu API için aşağıdaki ayrıntıları göz önünde bulundurun:
BeforeTestHostProcessStartAsync: Bu yöntem, test konaklarını başlatan test platformundan önce çağrılır.
OnTestHostProcessStartedAsync: Bu yöntem, test konağı başlatıldıktan hemen sonra çağrılır. Bu yöntem, test konağı işlem sonucuyla ilgili temel ayrıntıları sağlayan arabirimini uygulayan ITestHostProcessInformation bir nesne sunar.
Önemli
Bu yöntemin çağrılması test konağı yürütmesini durdurmaz. Duraklatmanız gerekiyorsa, gibi bir uzantı kaydetmeniz ve bunu ITestApplicationLifecycleCallbacks ile eşitlemeniz gerekir.
OnTestHostProcessExitedAsync: Test paketi yürütmesi tamamlandığında bu yöntem çağrılır. Bu yöntem, test konağı işleminin ITestHostProcessInformation sonucuyla ilgili önemli ayrıntıları aktaran arabirime bağlı bir nesne sağlar.
ITestHostProcessInformation Arabirim aşağıdaki ayrıntıları sağlar:
-
PID: Test ana bilgisayarının işlem kimliği. -
ExitCode: İşlemin çıkış kodu. Bu değer yalnızca yöntemindeOnTestHostProcessExitedAsynckullanılabilir.OnTestHostProcessStartedAsyncyönteminin içinde erişilmeye çalışılması bir hatayla sonuçlanır. -
HasExitedGracefully: Test ana bilgisayarının çöküp çökmediğini gösteren bir boole değeri. True ise, test ana bilgisayarının düzgün bir şekilde çıkmadığını gösterir.
Eklentiler yürütme sırası
Test platformu, bir test çerçevesi ve işlem içinde veya işlem dışı çalışabilen herhangi bir sayıda uzantıdan oluşur. Bu belge, bir özelliğin çağrılacağı zaman netlik sağlamak için tüm olası genişletilebilirlik noktalarına yapılan çağrıların sırasını özetler:
- ITestHostEnvironmentVariableProvider.UpdateAsync : İşlem dışı
- ITestHostEnvironmentVariableProvider.ValidateTestHostEnvironmentVariablesAsync : İşlem dışı
- ITestHostProcessLifetimeHandler.BeforeTestHostProcessStartAsync : İşlem dışı
- Test ana bilgisayar süreci başlangıcı
- ITestHostProcessLifetimeHandler.OnTestHostProcessStartedAsync : İşlem dışındaki süreçte, bu olay yarış koşullarına bağlı olarak işlem içi uzantıların eylemlerini iç içe geçirebilir.
- ITestApplicationLifecycleCallbacks.BeforeRunAsync: Süreç içi
- ITestSessionLifetimeHandler.OnTestSessionStartingAsync: İşlemde
- ITestFramework.CreateTestSessionAsync: İşlem içi
- ITestFramework.ExecuteRequestAsync: İşlem sırasında bu yöntem bir veya daha fazla kez çağrılabilir. Bu noktada, test çerçevesi IDataConsumer tarafından kullanılabilecek bilgileri IMessageBus'a iletecektir.
- ITestFramework.CloseTestSessionAsync: İşlem içi
- ITestSessionLifetimeHandler.OnTestSessionFinishingAsync: İşlemde
- ITestApplicationLifecycleCallbacks.AfterRunAsync: Süreç içinde
- İşlem içi temizleme, tüm uzantı noktalarında dispose ve IAsyncCleanableExtension çağrılarını içerir.
- ITestHostProcessLifetimeHandler.OnTestHostProcessExitedAsync : Süreç dışı
- İşlem dışı temizleme, tüm uzantı noktalarında dispose ve IAsyncCleanableExtension çağrılarını içerir.
Uzantı yardımcıları
Test platformu, uzantıların uygulanmasını basitleştirmek için bir dizi yardımcı sınıf ve arabirim sağlar. Bu yardımcılar geliştirme sürecini kolaylaştırmak ve uzantının platformun standartlarına uygun olmasını sağlamak için tasarlanmıştır.
Eşzamansız eklenti başlatma ve temizleme
Test çerçevesinin ve uzantıların fabrikalar aracılığıyla oluşturulması, zaman uyumlu oluşturucuları kullanan standart .NET nesne oluşturma mekanizmasına bağlıdır. Bir uzantı yoğun bir başlatma gerektiriyorsa (dosya sistemine veya ağa erişim gibi), oluşturucuların yerine void döndürmesi nedeniyle async/await desenini oluşturucuda kullanamaz.
Bu nedenle, test platformu basit bir arabirim aracılığıyla async/await desenini kullanarak bir uzantı başlatmak için bir yöntem sağlar. Simetri için, uzantıların kolayca kullanabileceği temizleme için asenkron bir arabirim de sunar.
public interface IAsyncInitializableExtension
{
Task InitializeAsync();
}
public interface IAsyncCleanableExtension
{
Task CleanupAsync();
}
IAsyncInitializableExtension.InitializeAsync: Bu yöntemin oluşturma fabrikasından sonra çağrılacağı garanti edilir.
IAsyncCleanableExtension.CleanupAsync: Bu yöntemin, test oturumunun sonlandırılması sırasında varsayılan veya DisposeAsync öncesinde en az bir kez çağrılacağı garanti edilir.
Önemli
Standart Dispose yönteme benzer şekilde, CleanupAsync birden çok kez çağrılabilir. Bir nesnenin CleanupAsync yöntemi birden fazla kez çağrılırsa, nesne ilk çağrıdan sonrakileri görmezden gelmelidir. Yöntemi birden çok kez çağrılırsa CleanupAsync nesne özel durum oluşturmamalıdır.
Uyarı
Varsayılan olarak, test platformu kullanılabilirse veya DisposeAsync uygulandıysa çağırırDispose. Test platformu her iki dispose yöntemini de çağırmayacak, ancak eğer uygulanmışsa async olanına öncelik verecektir.
CompositeExtensionFactory<T>
Uzantılar bölümünde açıklandığı gibi test platformu, işlem içinde ve dışında özel uzantıları dahil etmek için arabirimler uygulamanıza olanak tanır.
Her arabirim belirli bir özelliği ele alır ve .NET tasarıma göre bu arabirimi belirli bir nesneye uygularsınız. Uzantıyı, ilgili bölümlerde ayrıntılı olarak açıklandığı üzere AddXXX, TestHost veya TestHostController objesinden ITestApplicationBuilder belirli kayıt API’sini kullanarak kaydedebilirsiniz.
Ancak, iki uzantı arasında durum paylaşmanız gerekiyorsa, farklı arabirimler uygulayan farklı nesneleri uygulayıp kaydedebilmeniz, paylaşımı zor bir görev haline getirir. Herhangi bir yardım olmadan, bilgileri paylaşmak için bir uzantıyı diğerine geçirmenin bir yolu olması gerekir ve bu da tasarımı karmaşıklaştırır.
Bu nedenle, test platformu aynı türü kullanarak birden çok uzantı noktası uygulamak için gelişmiş bir yöntem sağlar ve bu da veri paylaşımını basit bir görev haline getirir. Tek yapmanız gereken, tek bir arabirim uygulaması için yaptığınız gibi aynı API kullanılarak kaydedilebilen komutunu kullanmaktır CompositeExtensionFactory<T>.
Örneğin, hem ITestSessionLifetimeHandlerhem de IDataConsumer uygulayan bir tür düşünün. Bu yaygın bir senaryodur çünkü genellikle test çerçevesinden bilgi toplamak istersiniz ve ardından test oturumu sona erdiğinde, ve IMessageBus kullanarak eserinizi gönderirsiniz.
Yapmanız gereken, normal olarak arabirimleri uygulamaktır:
internal class CustomExtension : ITestSessionLifetimeHandler, IDataConsumer, ...
{
...
}
Türünüz için CompositeExtensionFactory<CustomExtension> öğesini oluşturduktan sonra, hem IDataConsumer hem de ITestSessionLifetimeHandler API'lerine kaydedebilirsiniz, bu da CompositeExtensionFactory<T> için bir aşırı yükleme işlevi sunar.
var builder = await TestApplication.CreateBuilderAsync(args);
// ...
var factory = new CompositeExtensionFactory<CustomExtension>(serviceProvider => new CustomExtension());
builder.TestHost.AddTestSessionLifetimeHandle(factory);
builder.TestHost.AddDataConsumer(factory);
Fabrika oluşturucu, test platformu tarafından sağlanan hizmetlere erişmek için IServiceProvider kullanır.
Test platformu, bileşik uzantının yaşam döngüsünü yönetmekten sorumlu olacaktır.
Test platformunun, hem işlem içi hem de işlem dışı uzantılar için desteği nedeniyle, herhangi bir uzantı noktasını kendi istediğiniz şekilde birleştirmenin mümkün olmadığını belirtmek önemlidir. Uzantıların oluşturulması ve kullanılması konak türüne bağlıdır, yani yalnızca işlem içi (TestHost) ve işlem dışı (TestHostController) uzantıları birlikte gruplandırabilirsiniz.
Aşağıdaki birleşimler olasıdır:
-
ITestApplicationBuilder.TestHostiçinIDataConsumerveITestSessionLifetimeHandleröğelerini birleştirebilirsiniz. -
ITestApplicationBuilder.TestHostControllersiçinITestHostEnvironmentVariableProviderveITestHostProcessLifetimeHandleröğelerini birleştirebilirsiniz.