首页 > 解决方案 > 如何将一个测试方法的变量传递给 C# 中的另一个测试方法?

问题描述

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

例如: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();
    }
} 

标签: c#

解决方案


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

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

也是ClassInitializeAttribute 类或事件 AssemblyInitialize 属性(但我发现它们是static限制性的)。以下是官方示例

   [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 );



推荐阅读