如何使用C#在.NET中的数据驱动单元测试中实现JSON文件中的测试数据



我使用类库的xUnit包进行单元测试。我想尝试JSON方法,而不是数据驱动的单元测试的普通对象方法。然而,我看不出有任何地方能够做到这一点。

我所关注的是数据驱动的测试MemberData要求测试数据以IEnumerable<object[]>类型存在,当我从JSON文件中调用数据时,它在我的数据模型类中是类型化的。我要将它们添加到IEnumerable<object[]>中吗?或者还有别的办法?

这是我迄今为止的代码:

这是一个json文件,其中包含5个测试数据:

{
"user": [
{
"name": "John",
"age": 12,
"gender": "Male",
"Hobby": "Reading"
},
{
"name": "Susan",
"age": 34,
"gender": "Female",
"Hobby": "Gardening"
},
{
"name": "Larry",
"age": 24,
"gender": "Male",
"Hobby": "Gaming"
},
{
"name": "Jack",
"age": 3,
"gender": "Male",
"Hobby": "Sleeping"
},
{
"name": "Minnie",
"age": 15,
"gender": "Female",
"Hobby": "Partying"
}
]
}

这是测试类文件:

private User GetTestData()
{
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestData.json"); 
var reader = new StreamReader(filePath);
var jsonStr = reader.ReadToEnd();
var jsonObj = JObject.Parse(jsonStr);
var testDataObj = jsonObj["user"].ToString();
var testData = JsonConvert.DeserializeObject<User>(testDataObj);
return testData;
}
public static IEnumerable<object[]> ValidUserTestData()
{
//What should I do here?   
}
[Theory]
[MemberData(nameof(ValidUserTestData))]
public void Test1()
{
}

这是实施此类测试的正确方法吗?或者还有其他更好的选择可以在数据驱动测试中使用JSON文件吗?

谢谢。

MemberData属性接受对象的IEnumerable<object[]>,这些对象将逐个传递给您的测试方法。因此,您应该将JSON反序列化为对象数组(JSON示例包含一个User对象数组(,然后从ValidUserTestData方法返回它。还要确保Test1()接受正确的参数

[Theory]
[MemberData(nameof(ValidUserTestData))]
public void Test1(User user)
{
//test logic against every User instance
}

ValidUserTestData可以按照以下方式声明:首先读取json,然后将其转换为User对象的枚举,并将其作为IEnumerable<object[]>返回

public static IEnumerable<object[]> ValidUserTestData()
{
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestData.json");
var json = File.ReadAllText(filePath);
var jobject = JObject.Parse(json);
var users = jobject["user"]?.ToObject<IEnumerable<User>>();
foreach (var user in users ?? Enumerable.Empty<User>())
{
yield return new[] { user };
}
}

IEnumerable<object[]>中的每一项都代表一组参数,供测试方法接受。在测试方法中只需要一个输入参数,因此每个object[]都包含一个user实例。

关于它,有一篇很好的文章在xUnit中创建参数化测试

最新更新