在 Microsoft.Testing.Platform 的內容中, 功能 是指 執行特定動作或提供特定資訊的可能性。 這是測試架構和延伸模組的方法,可 宣告 其 功能以特定方式作,或將特定資訊提供給 要求者。
要求者 可以是測試會話中涉及的任何元件,例如平臺、延伸模組或測試架構本身。
功能系統的主要目標是促進測試會話中相關元件之間的有效通訊,讓他們能夠正確交換資訊並符合其各自的需求。
引導式範例
讓我們考慮一個假設的範例,以示範功能系統的必要性。
備註
此範例僅供說明之用,目前未在 Microsoft.Testing.Platform 或任何測試架構內實作。
想像一個情境,您有一個擴充套件需要測試框架每次執行不超過一個測試。 此外,在每個測試之後,擴充功能必須知道該特定測試的CPU使用量。
若要容納上述案例,您需要從測試架構查詢下列情況:
- 它一次只能執行一個測試。
- 它可提供每個測試所耗用 CPU 數量的相關信息。
延伸模組如何判斷測試架構是否能夠在此模式中運作,並提供測試會話的CPU使用量資訊? 在 Microsoft.Testing.Platform 中,這項功能是由 介面的 Microsoft.Testing.Platform.Capabilities.ICapability 實作來表示:
// Base capabilities contracts
public interface ICapability
{
}
public interface ICapabilities<TCapability>
where TCapability : ICapability
{
IReadOnlyCollection<TCapability> Capabilities { get; }
}
// Specific testing framework capabilities
public interface ITestFrameworkCapabilities : ICapabilities<ITestFrameworkCapability>
{
}
public interface ITestFrameworkCapability : ICapability
{
}
如您所見,ICapability 介面是 標記 介面,因為它可以代表 任何功能,而實際的實作將會與上下文依賴。 您也會觀察 ITestFrameworkCapability,其繼承自 ICapability 來分類功能。 功能系統的泛型本質允許依內容方便分組。
ITestFrameworkCapability 將 測試架構中實作的所有功能分組。
ICapabilities<TCapability> 介面會顯示延伸模組所實作之所有功能的 集。 同樣地,針對基礎,有一個名為 ITestFrameworkCapabilities的內容特定測試架構。 在 ITestFrameworkCapabilities 的過程中, 會被提供給平台。
若要建立解決上述案例的功能,您可以定義它,如下所示:
public interface IDisableParallelismCapability : ITestFrameworkCapability
{
bool CanDisableParallelism { get; }
bool CanProvidePerTestCpuConsumption { get; }
void Enable();
}
如果測試架構實作了這個介面,那麼在執行期間,可以查詢以下內容:
- 確認測試架構是否能夠關閉平行處理原則
CanDisableParallelism = true。 - 判斷測試架構是否可以提供 CPU 使用量數據
CanProvidePerTestCPUConsumption = true。 - 在測試會話開始之前叫用
Enable()方法,要求測試配接器啟動此模式。
延伸模組內的假設代碼段可能類似:
IServiceProvider provider = null; // TODO: Get IServiceProvider.
var capabilities = serviceProvider.GetRequiredService<ITestFrameworkCapabilities>();
// Utilize the `GetCapability` API to search for the specific capability to query.
var capability = capabilities.GetCapability<IDisableParallelismCapability>();
if (capability is null)
{
// Capability not supported...
}
else
{
capability.Enable();
if (capability.CanDisableParallelism)
{
// Do something...
}
if (capability.CanProvidePerTestCpuConsumption)
{
// Do something...
}
}
上述範例說明能力基礎結構如何啟用強大的機制,以在測試會話中各元件之間傳達能力。 雖然範例示範專為測試架構設計的功能,但任何元件都可以公開並實作繼承自 ICapability的延伸模組。
很明顯,並非所有詳細數據都可以透過介面進行通訊。 考慮前一個範例,如果支援 CanProvidePerTestCpuConsumption,延伸模組應該預期什麼? 測試架構 IMessageBus 預期會傳送何種自定義資訊? 此解決方案是對這一功能的資料文件。
擁有者 負責設計、出貨並清楚記錄,協助想要有效 合作 的實作者,使用需要該特定功能的擴充功能。
例如,TRX 報表延伸模組可讓測試架構實作必要的功能,以正確產生 TRX 報表。 註冊所需的擴充功能包含在 https://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport NuGet 套件中,而實作功能僅在 合約中,可透過https://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport.Abstractions NuGet 套件找到。
最後,讓我們總結功能系統的主要層面:
- 對於促進元件之間清楚且穩定的通訊而言,這是不可或缺的。
- 所有功能都應該繼承自
ICapability或繼承自它的介面,並且會透過具有ICapabilities介面的集合公開。 - 它有助於特徵的演進,而不會造成重大變更。 如果不支援特定功能,可以採取適當的動作。
- 設計、運送及記載功能使用的責任在於 功能擁有者。 Microsoft.Testing.Platform 也可以像任何其他擴充功能一樣 擁有 功能。
架構功能
平臺會公開名為 ITestFrameworkCapability 的特殊介面,這是針對測試架構公開之所有功能的基底。
向平臺註冊測試架構時,提供這些功能。
IBannerMessageOwnerCapability
選擇性 測試架構功能,可讓測試架構將橫幅訊息提供給平臺。 如果訊息 null 或功能不存在,則平臺會使用其預設橫幅訊息。
這項功能實作可讓您在決定是否應該顯示橫幅訊息時,將測試架構可能需要考慮的各種條件抽象化。
平臺會公開 IPlatformInformation 服務,提供有關建置自定義橫幅訊息時可能很有用之平臺的一些資訊。