如何使用 C# 在 .NET 中的数据驱动单元测试中实现 JSON 文件中的测试数据
How to implement test data in JSON file in data-driven unit test in .NET using C#
我正在为我的 class 库使用 xUnit 包进行单元测试。我想尝试使用 JSON 方法而不是数据驱动单元测试的常规对象方法。但是我看不到任何能够实现这一目标的地方。
我坚持的是数据驱动测试 MemberData 要求测试数据以 IEnumerable<object[]>
类型存在,当我从 JSON 文件调用数据时,它在我的数据模型中 class 输入。我是否将它们添加到 IEnumerable<object[]>
中?或者还有其他方法吗?
这是我目前的代码:
这是包含 5 个测试数据的 json 文件:
{
"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"
}
]
}
这是测试 class 文件:
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
方法中 return 它.还要确保 Test1()
接受正确的参数
[Theory]
[MemberData(nameof(ValidUserTestData))]
public void Test1(User user)
{
//test logic against every User instance
}
ValidUserTestData
可以按照以下方式声明:首先读取 json,然后将其转换为 User
对象的枚举,然后将 return 作为 [=13] =]
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
实例。
我正在为我的 class 库使用 xUnit 包进行单元测试。我想尝试使用 JSON 方法而不是数据驱动单元测试的常规对象方法。但是我看不到任何能够实现这一目标的地方。
我坚持的是数据驱动测试 MemberData 要求测试数据以 IEnumerable<object[]>
类型存在,当我从 JSON 文件调用数据时,它在我的数据模型中 class 输入。我是否将它们添加到 IEnumerable<object[]>
中?或者还有其他方法吗?
这是我目前的代码:
这是包含 5 个测试数据的 json 文件:
{
"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"
}
]
}
这是测试 class 文件:
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
方法中 return 它.还要确保 Test1()
接受正确的参数
[Theory]
[MemberData(nameof(ValidUserTestData))]
public void Test1(User user)
{
//test logic against every User instance
}
ValidUserTestData
可以按照以下方式声明:首先读取 json,然后将其转换为 User
对象的枚举,然后将 return 作为 [=13] =]
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
实例。