【问题标题】:Xunit Parameterize Selenium By TypeXunit 按类型参数化 Selenium
【发布时间】:2021-06-27 16:01:41
【问题描述】:

我过去曾问过几个与此相关的基本问题,并得到很好的答案来解释几个问题。我想我现在可以提出正确的问题了,因为我更加了解 Xunit 的工作原理!

我正在尝试使用 Visual Studio 对 C# 中的几个测试进行参数化。我需要将每个参数显示为单独的测试,如果需要可以单独运行(我知道有一个测试收集运行器和一个单独的测试运行器)。测试集合运行器是我的问题。

我知道 Xunit 需要对参数进行序列化,以便它们被测试收集运行程序拾取。我也知道它默认可以轻松序列化基本数据类型,如字符串、布尔值、整数等。

我尝试了各种方法来做到这一点,但结果好坏参半。我的问题是尝试参数化 Selenium 类型“By”。我似乎无法序列化这个。我试图欺骗 Xunit,例如使用字典 List 并尝试序列化字典中的(不走运!)

这是我遇到的最简洁的代码,它对于我正在尝试做的事情来说既简单又优雅,但我再次无法序列化“By”类型。我已经尝试将静态属性从 bool 更改为 By 并且它只返回所有参数的 1 个测试,所以它没有被序列化

public class ParamTest1
{
    static string test3 = "TestXYZ";

    public static TheoryData<int, bool, string, string> DataForTest1 = new TheoryData<int, bool, string, string>
    {
        { 1, true, "First", test3 },
        { 2, false, "Second", test3},
        { 3, true, "Third", test3}
    };

    [Theory(DisplayName = "My First Test"), MemberData(nameof(DataForTest1))]
    public void Test1(int valA, bool valB, string valC, string valD)
    {
        Assert.True(valB);
    }
}

这给了我

我知道这个特定的代码没有调用 IXunitSerializable

所以这是我需要的另一个工作示例,但我无法让它与“按”类型一起使用

public class ValidateTestCase : IXunitSerializable
{
    public Guid Coupon { get; set; }
    public bool IsValid { get; set; }

    public void Serialize(IXunitSerializationInfo info)
    {
        info.AddValue(nameof(Coupon), Coupon.ToString());
    }

    public void Deserialize(IXunitSerializationInfo info) { }

}

public class Testing
{
    public static IEnumerable<object[]> ValidateTestCases
    {
        get
        {
            yield return new object[] { new ValidateTestCase { Coupon = Guid.Parse("73e4d185-70cf-4ce4-bc3f-187b7a40e167"), IsValid = false } };
            yield return new object[] { new ValidateTestCase { Coupon = Guid.Parse("93b983fb-5b6a-4845-a769-db41900b7df9"), IsValid = false } };
            yield return new object[] { new ValidateTestCase { Coupon = Guid.Parse("99c03283-33cb-4e56-a010-c2bc0758ad27"), IsValid = false } };
            yield return new object[] { new ValidateTestCase { Coupon = Guid.Parse("16a7fe80-3111-44b0-9ebf-c7159bea637d"), IsValid = false } };
            yield return new object[] { new ValidateTestCase { Coupon = Guid.Parse("8b38b4aa-d70f-4ce7-8992-8a60936c5c58"), IsValid = false } };
            yield return new object[] { new ValidateTestCase { Coupon = Guid.Parse("abc60aa0-a33b-4057-8f99-5cdceda35c70"), IsValid = true } };
        }
    }

    [Theory(DisplayName = "CouponService should validate coupons")]
    [MemberData(nameof(ValidateTestCases))]
    public void MyCouponService_Validates(ValidateTestCase vtc)
    {

        Assert.Equal(vtc.IsValid, true);
    }
}

最后,对于任何想知道“By”类型是什么的人,我指的是: [![在此处输入图片描述][2]][2]

它在调试器中,所以你可以看到里面发生了什么: [![在此处输入图片描述][3]][3]

我知道那里发生了很多事情,但如果有人有任何想法或建议,那就太好了!

总而言之,我无法参数化 Selenium 的“数据类型”。 [2]:https://i.stack.imgur.com/XcLcn.png [3]:https://i.stack.imgur.com/T9so1.png

【问题讨论】:

    标签: selenium serialization xunit


    【解决方案1】:

    序列化类

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Text;
    using OpenQA.Selenium;
    using Xunit.Abstractions;
    
    namespace XUnitTestProject1
    {
       
            public class ParameterizedHook
            {
                public By p1 { get; set; }
                public By p2 { get; set; }
    
                public string assertion { get; set; }
            }
    
            public class TheoryWrapper<T> : IXunitSerializable
            {
                public TheoryWrapper(string label, T @object)
                {
                    Name = label;
                    Object = @object;
                }
                public TheoryWrapper()
                {
    
                }
                public string Name { get; set; }
                public T Object { get; set; }
    
                public void Deserialize(IXunitSerializationInfo info)
                {
                    Name = info.GetValue<string>("Label");
                    Object = JsonConvert.DeserializeObject<T>(info.GetValue<string>("objValue"));
                }
    
                public void Serialize(IXunitSerializationInfo info)
                {
                    info.AddValue("Label", Name, typeof(string));
                    var json = JsonConvert.SerializeObject(Object);
                    info.AddValue("objValue", json);
                }
    
                public override string ToString()
                {
                    return Name;
                }
    
            }
        }
    
    

    工作测试

    public static IEnumerable<object[]> ComplexTheoryData
            {
                get
                {
                    return new List<object[]>
                    {
                        new object[] {0, new TheoryWrapper<ParameterizedHook>("Pass0", new ParameterizedHook { p1 = nav_hold.pip_builder.dash_expand_pip_builder_menu, p2 = nav_hold.pip_builder.dash_project_stages, assertion = "WORK STAGE" })},
                        new object[] {0, new TheoryWrapper<ParameterizedHook>("Pass0", new ParameterizedHook { p1 = nav_hold.pip_builder.dash_expand_pip_builder_menu, p2 = nav_hold.pip_builder.dash_project_stages, assertion = "WORK STAGES" })},
                        //new object[] {0, new TheoryWrapper<ParameterizedHook>("Pass0", new ParameterizedHook { TestData = b.login })},
                        //new object[] {1, new TheoryWrapper<ParameterizedHook>("Pass1", new ParameterizedHook { TestData = b.password })}
    
                    };
                }
            }
            [SkippableTheory]
            [Trait("xUnit", "ForTestRunner")]
            [MemberData(nameof(ComplexTheoryData))]
            public void Test_Navigation(int id, TheoryWrapper<ParameterizedHook> test)
            {
                nav_met.NavMethodTest(test.Object.p1, test.Object.p2);
                By page_title = By.Id("ctl00_lblPageTitle");
                Assert.True(nav_met.VerifyText(page_title, test.Object.assertion));
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      相关资源
      最近更新 更多