我们可以在 C# 中向 TestInitialize 发送参数吗?

Can we send a parameter to TestInitialize in C#?

我正在使用 CodedUI 进行自动化测试。因为我正在使用两个应用程序,所以假设 A 和 B。A 需要在每个测试用例开始执行时启动。所以我把它放在 TestInitialize 中。所以我从 TestInitialize 调用一个函数并发送参数,即应用程序 A 的位置。但是如果有不同版本的 App a 我想发送一个参数到 TestInitialize 。

我现在的密码是

[TestInitialize()]
public void MyTestInitialize()
{
    App_Launch(@"C:\Emulator\App_Version1\Launch_App.exe");
}

有不同的应用程序版本 因此,如果我必须启动 App_Version2,那么我必须更改硬编码参数中的文件夹名称。

如果我想要以下内容怎么办

[TestInitialize()]
public void MyTestInitialize(string Path)
{
    App_Launch(@Path);
}

将路径发送到 TestInitialize

您不能向标有 TestInitializeAttribute 的方法添加参数,但有一些替代方法。

  1. 如果版本 1 有多个测试,版本 2 有多个测试,最好的选择 (imo) 是简单地创建两个不同的测试 classes.

  2. 您可以简单地不使用 [TestInitialize] 并在每次测试开始时调用两个私有方法之一,每个方法启动各自的应用程序。

  3. 您可以以某种方式使用 TestContext 属性。它在执行测试之前自动设置,可以从 TestInitialize 方法访问。其中的信息可能会为您提供足够的信息来决定启动哪个应用程序。不过,我不确定是否有充分的理由选择这个而不是选项 1。

  4. 如果需要在两个版本上执行所有 in 测试 ,您可以使用 data driven test. This allows you to execute a single test multiple times with different input. This also requires the TestContext attribute. However, personally I find data driven tests in MSTest horrendous. It requires the use of the DataSourceAttribute,除非您的目标是 [=48] =] 存储应用程序。

  5. 使用继承。将需要为两个版本执行的所有测试放在没有 [TestInitialize] 的基础 class 中。仅将测试初始化​​放在两个继承的 classes 中。不要用 TestClassAttribute 标记基数 class,最好将其标记为 abstract,这样如果没有任何形式的初始化,测试也不会是 运行。

这完全取决于情况,真的。如果您觉得您确实需要选项 4 并且您的目标不是 Windows Store,我会认真考虑 NUnit,它提供了更灵活的参数化测试。