我需要对这个功能进行单元测试吗?
Do I need to unit test this function?
我一直在研究很多关于单元测试的问题,我有几个函数,它们的唯一目的是根据模型的用户输入在数据库中添加或更新行。从我读过的内容来看,单元测试似乎并没有真正用于此。集成测试可能更有意义,但我还没有对这些进行太多研究。很抱歉,如果这在其他地方有所涉及,我试图找到一个类似的例子,这个问题是我能找到的最接近的问题:https://softwareengineering.stackexchange.com/questions/198453/is-there-a-point-to-unit-tests-that-stub-and-mock-everything-public ...这意味着单元测试不是测试函数的最佳方法只是调用数据库。
这是我们的数据库函数之一的示例...
public void AddDependant(AddDependantView addDependantView, int ID)
{
using (var db = new EnrollmentDataModel())
{
Dependant dependant = new dependant();
dependant.ID = ID;
dependant.FirstName = addDependantView.FirstName;
dependant.LastName = addDependantView.LastName;
dependant.Relation = addDependantView.Relation;
dependant.Birthday = (addDependantView.BirthDate).Value.ToString("MM/dd/yyyy");
dependant.Active = true;
dependant.RowCreatedDateTime = DateTime.Now;
db.Dependant.Add(dependant);
db.SaveChanges();
UpdateLog(ID, "Dependant Data Added", "User added their dependant data.");
}
}
最后调用的 "UpdateLog" 函数在结构上与此类似,但在不同的数据库中添加了一个条目,用于记录任何用户 activity。
那么此功能是否会受益于单元测试?如果这样做会有什么好处?集成测试会是更好的选择吗?如果这太基础或太宽泛,我很抱歉,但我是单元测试的新手,想获得良好的实践。
最后回答你的问题,这个函数会从集成测试中受益更多。对该功能进行单元测试的好处主要是通知您代码中的某些内容何时发生更改。
例如,对于 mocks/spies/stubs,您可以编写测试来断言此函数进行了正确的 db api 调用。并且这些调用得到正确的参数。但是,如果您的模拟与真实事物不同步,这些测试可以作为单元测试通过,但在集成测试中仍然会失败。
您可以在此处进行单元测试的最佳部分是 dependent
对象。断言它有一个 ID、FirstName、LastName 等……然后如果您的生产代码发生过更改,假设其中一个属性被意外删除。您的单元测试会让您知道的速度比集成测试快得多。
这里的缺点是您更有可能故意更改某些内容,而不是意外更改。这些单元测试可能会变得烦人,因为每次您更改某些内容时它们都会失败。
所以有好处也有坏处。好处是否值得麻烦取决于您。我想大多数人会同意,对于像这个功能这样的东西,您真正需要的只是集成测试。
我一直在研究很多关于单元测试的问题,我有几个函数,它们的唯一目的是根据模型的用户输入在数据库中添加或更新行。从我读过的内容来看,单元测试似乎并没有真正用于此。集成测试可能更有意义,但我还没有对这些进行太多研究。很抱歉,如果这在其他地方有所涉及,我试图找到一个类似的例子,这个问题是我能找到的最接近的问题:https://softwareengineering.stackexchange.com/questions/198453/is-there-a-point-to-unit-tests-that-stub-and-mock-everything-public ...这意味着单元测试不是测试函数的最佳方法只是调用数据库。
这是我们的数据库函数之一的示例...
public void AddDependant(AddDependantView addDependantView, int ID)
{
using (var db = new EnrollmentDataModel())
{
Dependant dependant = new dependant();
dependant.ID = ID;
dependant.FirstName = addDependantView.FirstName;
dependant.LastName = addDependantView.LastName;
dependant.Relation = addDependantView.Relation;
dependant.Birthday = (addDependantView.BirthDate).Value.ToString("MM/dd/yyyy");
dependant.Active = true;
dependant.RowCreatedDateTime = DateTime.Now;
db.Dependant.Add(dependant);
db.SaveChanges();
UpdateLog(ID, "Dependant Data Added", "User added their dependant data.");
}
}
最后调用的 "UpdateLog" 函数在结构上与此类似,但在不同的数据库中添加了一个条目,用于记录任何用户 activity。
那么此功能是否会受益于单元测试?如果这样做会有什么好处?集成测试会是更好的选择吗?如果这太基础或太宽泛,我很抱歉,但我是单元测试的新手,想获得良好的实践。
最后回答你的问题,这个函数会从集成测试中受益更多。对该功能进行单元测试的好处主要是通知您代码中的某些内容何时发生更改。
例如,对于 mocks/spies/stubs,您可以编写测试来断言此函数进行了正确的 db api 调用。并且这些调用得到正确的参数。但是,如果您的模拟与真实事物不同步,这些测试可以作为单元测试通过,但在集成测试中仍然会失败。
您可以在此处进行单元测试的最佳部分是 dependent
对象。断言它有一个 ID、FirstName、LastName 等……然后如果您的生产代码发生过更改,假设其中一个属性被意外删除。您的单元测试会让您知道的速度比集成测试快得多。
这里的缺点是您更有可能故意更改某些内容,而不是意外更改。这些单元测试可能会变得烦人,因为每次您更改某些内容时它们都会失败。
所以有好处也有坏处。好处是否值得麻烦取决于您。我想大多数人会同意,对于像这个功能这样的东西,您真正需要的只是集成测试。