【问题标题】:How to pass variable of one Test Method to another Test Method in C#?如何将一个测试方法的变量传递给 C# 中的另一个测试方法?
【发布时间】:2021-04-13 06:01:29
【问题描述】:

我必须利用在一个测试方法中初始化的字符串变量的值,并且我希望在下一个测试方法中使用相同的值

例如:TestMethod1 如下: 我有一个注册表单,其中我有一个用户名字段。

我正在使用 sendkeys() 传递用户名:“Test123” ----->(来自 excel) 现在,如果我重新运行脚本,我会收到错误消息“用户名已存在,请输入唯一的用户名”

针对这个问题,我创建了一个函数,用于将随机字符串附加到用户名。所以新的用户名将是“Test123SomeRandomstring”----> 这存储在TestMethod1的字符串变量中

现在我的下一个测试方法有问题,如下所示 (TestMethod2),即登录 TestMethod:

现在,当我尝试使用用户名登录时,我需要 TestMethod1 中的字符串变量用于在 TestMethod2 中登录。

有人可以帮忙吗?

提前致谢。

注意:我必须只在 C# 中创建上述代码

[TestMethod]
public virtual void TestRegristration()
{
    try
    {
        LoginPage ObjLoginPage = LoginPage.GetInstance(this);

        var generator = new GenerateRandomString();

        var randomString = generator.RandomString();

        ObjLoginPage.enterUserName(1, ObjExcelHelper, Driver, "UserName",randomString);//Enter Usernamewith some random string

        ObjLoginPage.enterPassword(1, ObjExcelHelper, Driver, "Password");//Enter Password, Confirm Password and Click Register Button
    }
    catch (Exception ex)
    {
        ex.ToString();
    }
}

[TestMethod]
public virtual void TestLoginWithValidCredential()
{
    try
    {
        LoginPage ObjLoginPage = LoginPage.GetInstance(this);
        
        ObjLoginPage.enterUserName(1, ObjExcelHelper, Driver, "UserName");//need to pass randomString here with username from TestMethod1

        //ObjLoginPage.enterPassword(1, ObjExcelHelper, Driver, "Password");
    }
    catch (Exception ex)
    {
        ex.ToString();
    }
}

public class GenerateRandomString
{
    public string RandomString()
    {
        int length = 5;

        // creating a StringBuilder object()
        StringBuilder str_build = new StringBuilder();
        Random random = new Random();

        char letter;

        for (int i = 0; i < length; i++)
        {
            double flt = random.NextDouble();
            int shift = Convert.ToInt32(Math.Floor(25 * flt));
            letter = Convert.ToChar(shift + 65);
            str_build.Append(letter);
        }
        //System.Console.WriteLine(str_build.ToString());
        return str_build.ToString();
    }
} 

【问题讨论】:

  • 在测试方法之间存在这种依赖关系是不好的做法。测试用例应该可以以任何顺序独立运行。一种方法是在类中的所有测试之前在 [ClassInitialize] 方法中创建随机用户名一次。
  • 顺便说一句。为什么你的测试方法是虚拟的?

标签: c#


【解决方案1】:

理想情况下,单个测试应该是独立的,您不应依赖测试顺序。

下一个最好的事情是构造函数。在 MS Test 中,构造函数被调用一次。

还有ClassInitializeAttribute Class 或事件AssemblyInitialize 属性(但它们是static,我认为这是有限制的)。这里是官方Examples

   [TestClass()]
   public sealed class DivideClassTest
   {
       [AssemblyInitialize()]
       public static void AssemblyInit(TestContext context)
       {
           MessageBox.Show("AssemblyInit " + context.TestName);
       }

       [ClassInitialize()]
       public static void ClassInit(TestContext context)
       {
           MessageBox.Show("ClassInit " + context.TestName);
       }

但是,对于您的情况,可能是一个字符串,static readonly 可能就足够了。

private static readonly Test UserId = ...

如果用户不存在,辅助方法可以创建用户,如果用户已经存在,则可以获取 id。


更新

[TestClass()]
public class MyTestClass
{
  private string TestId {get; set;}

  public MyTestClass() 
  {
      var generator = new GenerateRandomString();
      TestId = generator.RandomString();

  [TestMethod]
  public void TestRegristration()
        {
           ...
           ObjLoginPage.enterUserName(1, ObjExcelHelper, Driver, "UserName",TestId );


[TestClass()]
public class MyTestClass
{
  private static string TestId {get; set;}

  [ClassInitialize()]
  public static void ClassInit(TestContext context)
  {
      var generator = new GenerateRandomString();
      TestId = generator.RandomString();
  }

  [TestMethod]
  public void TestRegristration()
  {
      ...
      ObjLoginPage.enterUserName(1, ObjExcelHelper, Driver, "UserName",TestId );


【讨论】:

  • 您能否更详细地解释一下如何在我的方法中使用 [ClassInitialize]?
猜你喜欢
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多