我在MVCStoreFront应用程序上观看Rob Connerys的网络广播,我注意到他甚至是最普通的东西,例如:
public Decimal DiscountPrice
{
get
{
return this.Price - this.Discount;
}
}
Run Code Online (Sandbox Code Playgroud)
会有一个测试像:
[TestMethod]
public void Test_DiscountPrice
{
Product p = new Product();
p.Price = 100;
p.Discount = 20;
Assert.IsEqual(p.DiscountPrice,80);
}
Run Code Online (Sandbox Code Playgroud)
虽然,我都是单元测试,但我有时想知道这种形式的测试首次开发是否真的有益,例如,在实际过程中,您的代码上方有3-4层(业务请求,需求文档,架构文档) ,实际定义的业务规则(折扣价格是价格 - 折扣)可能被错误定义.
如果是这种情况,您的单元测试对您来说毫无意义.
此外,您的单元测试是另一个失败点:
[TestMethod]
public void Test_DiscountPrice
{
Product p = new Product();
p.Price = 100;
p.Discount = 20;
Assert.IsEqual(p.DiscountPrice,90);
}
Run Code Online (Sandbox Code Playgroud)
现在测试存在缺陷.显然,在一个简单的测试中,这没什么大不了的,但是我们说我们正在测试一个复杂的业务规则.我们在这里获得了什么?
快速推进应用程序生命的两年,当维护开发人员维护它时.现在业务改变了规则,测试再次中断,一些菜鸟开发人员然后错误地修复了测试......我们现在又有了另一个失败点.
我所看到的只是更多可能的失败点,没有真正有益的回报,如果折扣价格错误,测试团队仍然会发现问题,单元测试如何保存任何工作?
我在这里错过了什么?请教我爱TDD,因为到目前为止我很难接受TDD.我也想要,因为我想保持进步,但这对我来说没有意义.
编辑:有几个人一直提到测试有助于执行规范.根据我的经验,规范也是错误的,通常是错误的,但也许我注定要在一个组织中工作,这些组织的规范是由那些不应该编写规范的人编写的.
这两个想法听起来与我非常相似,但可能存在微妙的差异或完全相同的事情,以不同的方式解释.TDD与测试第一开发/编程之间有什么关系?
几年来,我一直在使用一种名为qmTest的测试工具,它允许我为一些Firebird数据库进行测试驱动的数据库开发.我为一个新功能(表,触发器,存储过程等)编写测试,直到它失败,然后修改数据库直到测试通过.如果有必要,我会在测试上做更多工作,直到它再次失败,然后修改数据库直到测试通过.一旦完成对该功能的测试并且100%的时间通过,我将其保存在数据库的一系列其他测试中.在继续进行另一个测试或部署之前,我将所有测试作为套件运行,以确保没有任何损坏.测试可以依赖于其他测试,结果将记录并显示在浏览器中.
我相信,这里没什么新鲜事.
我们的商店旨在标准化MSSQLServer,我想使用相同的程序来开发我们的数据库.有没有人知道允许或鼓励这种开发的工具?我相信团队系统确实如此,但我们目前并不拥有它,并且可能不会持续一段时间.
我并不反对编写脚本,但欢迎使用更加图形化的环境.
有什么建议?
我过去曾经谈过这个话题,我想我可能知道答案,但我还是没能说清楚.
这是我认为我知道的:
我怀疑你是测试优先而不是测试驱动,如果你在编写测试之前已经掌握了事情将如何工作的想法,所以你先编写测试,然后在实现你的想法之前测试你的想法.即你对实现的想法是第一位的,并推动测试的样子.
如果您是测试驱动的,那么您正试图通过测试来推动实现的样子.您为自己想要的某些行为编写了一个测试,而不是对实现的先入为主的想法,因此您必须在"重构"阶段提出一个实现才能很好地通过测试.
我的问题是:
所以,我现在越来越多地被测试驱动的开发所吞噬,而且我在考虑tdd时编写的代码越多,看起来就越多,我必须考虑我应该编写的测试范围.我想就我应该为自己的项目编写多少单元测试设置一个个人策略,并且想知道我是否会得到一些关于你如何接近你的方法的建议.
这是我目前面临的一个决定的例子......
我有三节课......
public class User
{
public string Username { get; set; }
public List<Favorite> Favorties { get; set; }
}
public class Favorite
{
public string Username { get; set; }
public int rank { get; set; }
}
public class UserManager
{
public List<Favorite> GetTop5(User user)
{
var qry = from fav in user.Favorties.OrderBy(f => f.rank)
select fav;
return qry.Take<Favorite>(5).ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个User类的数据访问层,我已经有了一个"GetUser"测试设置.正如您所看到的,在我的业务逻辑中,我有一个方法UserManager.GetTop5(),它返回我刚从数据库中取出的用户的前5个收藏夹.此方法非常简单,目前不涉及任何外部资源或依赖项.
所以我的问题是你会继续为这个"GetTop5"功能点编写另一个测试,即使失败的可能性很小吗?
如果您将来扩展功能,您是否设置了测试?或者你认为这里的测试是否过度?
我想在一个只使用SQL Server中的存储过程和函数实现的项目中实现Test First Development.
有一种方法可以简化存储过程和函数的单元测试的实现吗?如果没有,创建这些单元测试的最佳策略是什么?
我将开始一个我自己的项目,它将是ASP.NET MVC + Fluent NHibernate.我想尽可能多地使用测试优先方法.那么,我从哪里开始呢?数据库架构?领域模型?将域模型类映射到数据库?
test-first ×7
tdd ×5
unit-testing ×4
sql-server ×2
agile ×1
asp.net-mvc ×1
c# ×1
sql ×1
testing ×1