首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >功能测试是单元测试的超集,是吗?

功能测试是单元测试的超集,是吗?
EN

Stack Overflow用户
提问于 2013-11-12 08:11:15
回答 1查看 160关注 0票数 2

我已经阅读了一段时间关于单元测试和功能测试的文章。

如果我编写了详尽的功能测试,它们是不是也会覆盖下面的单元,这就使得单元测试变得多余了吗?

我们遵循敏捷,使用WebDriver编写功能测试,只要完成功能的“片段”,这通常是2-4周的冲刺时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-12 16:31:44

也许,但不一定。

功能测试可以被认为是“黑箱”测试,在测试中,您正在查看特定的函数(不管它是否是单个方法、模块、系统等),并检查给定输入是否得到给定的输出。

但是,如果功能测试失败了,您所能说的就是系统是错误的;它不一定能给出系统中哪一部分应该受到责备的任何指示。当然,你会去诊断问题,但你不知道问题是什么。

e.g

代码语言:javascript
运行
复制
//assuming you have a UserService that amongst other things passes through to a UserRepository
    var repo = new UserRepository();
    var sut = new UserService(repo);
    var user = sut.GetUserByID(1);
    Assert.IsNotNull(user); //Suppose this fails.

在上述情况下,您不知道这是因为UserService的GetUserByID()函数是错误的--可能它没有调用repo.GetUserByID,只返回null,也许它确实从repo获得了一个User,但是意外地返回了一个未初始化的临时变量等等--或者可能是因为依赖项(repo)本身是错误的。在任何情况下,您都必须调试这个问题。

另一方面,单元测试更像是“白盒”测试,在这种测试中,您已经有效地将系统的盖子从系统中取下,并且正在测试系统的行为方式,以便完成您希望它做的事情。

例如(下面的代码可能不编译,只是为了演示目的)

代码语言:javascript
运行
复制
//setup a fake repo and fake the GetUserByID method to return a known instance:
    var repo = new Mock<UserRepository>();
    var user = new User{ID=1;}
    repo.Setup(r=>r.GetUserByID(1).Returns(user);
    var sut = new UserService(repo.Object);
    var actual= sut.GetUserByID(1);
    //now make sure we got back what we expected. If we didn't then UserService has a problem.
    Assert.IsNotNull(user);
    Assert.AreEqual(user,actual);

在本例中,您将显式地验证sut.GetUserByID()是否以预期的方式运行--即它调用repo.GetUserByID()并返回结果对象,而不损坏它或更改它。

如果这个单元测试通过了,但是功能测试失败了,那么您可以自信地说,问题不在于UserService,而在于UserRepository类,甚至不用看代码。这可能会或不会节省你的时间,这真的取决于你的功能单位有多复杂。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19923978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档