标签: integration-testing

集成测试中MockMvc和RestTemplate之间的区别

无论MockMvcRestTemplate用于与Spring和JUnit集成测试.

问题是:它们之间的区别是什么?我们应该选择哪一个而不是另一个?

以下是两个选项的示例:

//MockMVC example
mockMvc.perform(get("/api/users"))
            .andExpect(status().isOk())
            (...)

//RestTemplate example
ResponseEntity<User> entity = restTemplate.exchange("/api/users",
            HttpMethod.GET,
            new HttpEntity<String>(...),
            User.class);
assertEquals(HttpStatus.OK, entity.getStatusCode());
Run Code Online (Sandbox Code Playgroud)

java junit spring integration-testing spring-mvc

45
推荐指数
3
解决办法
2万
查看次数

如何在.net6中使用WebApplicationFactory(没有可讲的入口点)

在 ASP.NET Core 6 中,默认模板将所有内容从Startup.cs移至Program.cs,并使用 Program.cs 中的顶级语句,因此不再有(可说的)Program类 ether。

这看起来很棒,但现在,我需要测试这一切。WebApplicationFactory<T>仍然期望我通过入门级,但我不能这样做(因为它的名字现在难以形容)。

预计如何在 ASP.NET Core 6 中配置集成测试?

integration-testing asp.net-web-api asp.net-core .net-6.0

45
推荐指数
2
解决办法
4万
查看次数

应该测试内部实现,还是仅测试公共行为?

给定软件......

  • 该系统由几个子系统组成
  • 每个子系统由几个组件组成
  • 每个组件都使用许多类实现

...我喜欢编写每个子系统或组件的自动化测试.

我没有为组件的每个内部类编写测试(因为每个类都有助于组件的公共功能,因此可以通过组件的公共API从外部测试/测试).

当我重构组件的实现时(我经常这样做,作为添加新功能的一部分),因此我不需要改变任何现有的自动化测试:因为测试仅依赖于组件的公共API和公共API通常是扩大而不是改变.

我认为这个政策与重构测试代码这样的文件形成了鲜明的对比,后者说...

  • "......单元测试..."
  • "......系统中每个班级的测试班......"
  • "......测试代码/生产代码比率...理想地被认为接近1:1的比例......"

...所有这些我认为我不同意(或至少不练习).

我的问题是,如果你不同意我的政策,你会解释原因吗?在什么情况下这种测试程度不足?

综上所述:

  • 公共接口经过测试(并经过重新测试),很少改变(它们被添加到但很少被改变)
  • 内部API隐藏在公共API之后,可以在不重写测试公共API的测试用例的情况下进行更改

脚注:我的一些"测试用例"实际上是作为数据实现的.例如,UI的测试用例包含数据文件,其中包含各种用户输入和相应的预期系统输出.测试系统意味着拥有测试代码,该代码读取每个数据文件,将输入重放到系统中,并断言它获得相应的预期输出.

虽然我很少需要更改测试代码(因为公共API通常是添加而不是更改),但我发现有时候(例如每周两次)需要更改一些现有的数据文件.当我更好地更改系统输出(即新功能改进现有输出)时可能会发生这种情况,这可能导致现有测试"失败"(因为测试代码只会尝试断言输出没有改变).要处理这些情况,我会执行以下操作:

  • 重新运行自动化测试套件,该套件有一个特殊的运行时标志,告诉它不要断言输出,而是将新输出捕获到新目录中
  • 使用可视化差异工具查看哪些输出数据文件(即哪些测试用例)已更改,并验证这些更改是否正常并且符合新功能的预期
  • 通过将新目录中的新输出文件复制到运行测试用例的目录(覆盖旧测试)来更新现有测试

脚注:通过"组件",我的意思是"一个DLL"或"一个组件"...这个大到足以在系统的体系结构或部署图上可见,通常使用数十个或100个类实现,以及因此与公共API只包含约1或接口少数......一些可能被分配到的开发商之一的团队(其中不同的组件被分配到不同的团队),并且将根据康威定律有一个相对稳定的公共API.


脚注:文章面向对象测试:神话与现实说,

神话:黑盒测试就足够了. 如果您使用类接口或规范仔细测试测试用例设计,则可以确保该类已经完全运用.白盒测试(查看方法的实现来设计测试)违反了封装的概念.

现实:OO结构很重要,第二部分.许多研究表明,开发人员认为黑盒测试套件非常彻底,只能在测试实施中使用三分之一到一半的语句(更不用说路径或状态)了.这有三个原因.首先,选择的输入或状态通常执行正常路径,但不强制所有可能的路径/状态.其次,单独的黑盒测试无法揭示惊喜.假设我们已经测试了被测系统的所有指定行为.为了确信没有未指明的行为,我们需要知道系统的任何部分是否未被黑盒测试套件执行.获取此信息的唯一方法是通过代码检测.第三,通常很难在不检查源代码的情况下执行异常和错误处理.

我应该补充一点,我正在进行白盒功能测试:我看到了代码(在实现中),我编写了功能测试(驱动公共API)来练习各种代码分支(功能实现的细节).

refactoring integration-testing automated-tests unit-testing code-coverage

44
推荐指数
4
解决办法
1万
查看次数

如何在maven中的集成测试目标中运行单个测试

我们为maven中的集成测试阶段生命周期定义了数百个测试,并且需要很长时间才能完成.

我想要做的只是运行一个测试integration-test.我试过做:

mvn -Dtest=<my-test> integration-test
Run Code Online (Sandbox Code Playgroud)

但这不起作用.将-Dtest只运行在单元测试目标测试,而不是集成测试阶段.我试过了-Dintegration-test=<my-test>,但是被忽略了.

有没有办法做到这一点 ?


我的配置是:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <executions> 
        <execution> 
            <id>surefire-it</id> 
            <phase>integration-test</phase> 
            <goals> 
                <goal>test</goal> 
            </goals> 
            <configuration> 
                <excludes> 
                    <exclude>none</exclude> 
                </excludes> 
                <includes>
                    <include>**/api/**</include> 
                </includes> 
    ..... 
Run Code Online (Sandbox Code Playgroud)

integration-testing maven-2 maven-surefire-plugin

42
推荐指数
4
解决办法
3万
查看次数

什么是单元测试和集成测试,以及我应该了解的其他类型的测试?

我见过其他人在Stack Overflow上提到了几种类型的测试.

我记得的是单元测试和集成测试.特别是单元测试被提到了很多.什么是单元测试?什么是集成测试?我应该注意哪些其他重要的测试技术?

编程不是我的职业,但我希望它有一天;关于生产等的东西也受到欢迎.

testing integration-testing unit-testing

41
推荐指数
5
解决办法
3万
查看次数

我们可以使用JUNIT进行自动集成测试吗?

您如何自动化集成测试?我使用JUnit进行其中一些测试.这是解决方案之一还是完全错误的?你有什么建议?

java integration-testing unit-testing

39
推荐指数
3
解决办法
4万
查看次数

使用Spring进行单元测试与集成测试

我正在开发一个Spring MVC项目,我对源代码树中的所有各种组件进行了单元测试.

例如,如果我有一个HomeController需要LoginService注入的控制器,那么在我的单元测试中,HomeControllerTest我只是将对象实例化为正常(在Spring之外)并注入属性:

protected void setUp() throws Exception {
    super.setUp();
    //...
    controller = new HomeController();
    controller.setLoginService( new SimpleLoginService() );
    //...
}
Run Code Online (Sandbox Code Playgroud)

这对于将每个组件作为一个独立的单元进行测试非常有用 - 除了我在项目中有几十个类,在编写一个类并为它编写成功的单元测试后,我一直忘记更新我的Spring MVC上下文文件部署的应用程序中的实际布线.我发现当我将项目部署到Tomcat并从非有线bean中找到一堆NullPointers时,我忘了更新上下文文件.

所以,这是我的问题:

  1. 这是我的第一个Spring项目 - 正如我所做的那样,为单个bean创建单元测试是正常的,然后创建第二套测试(集成测试)来测试一切是否与实际应用程序上下文一致?这是否有既定的最佳实践?

  2. 另外,如何将单元测试与集成测试分开?我有所有的源代码src,单元测试test- 应该有第二个测试文件夹(如test-integration)用于集成测试用例?

由于这是我的第一个春季项目,我很好奇其他人通常会做这类事情 - 而不是重新发明轮子我宁愿问社区其他人.

java tdd junit integration-testing spring-mvc

38
推荐指数
2
解决办法
1万
查看次数

是否可以在rails集成测试或规范中指定用户代理?

我之前在轨道2的应用程序在做这个ActionController::IntegrationTest

get '/', {}, {:user_agent => "Googlebot"}
Run Code Online (Sandbox Code Playgroud)

但这似乎在Rails 3中不再起作用了.

我该怎么办?

integration-testing ruby-on-rails

37
推荐指数
4
解决办法
9652
查看次数

嘲笑集成测试

如何模拟集成测试所需的许多依赖项?

我使用Mockito进行"纯粹的"单元测试.在这种情况下,'Pure'意味着测试单个类,模拟它的所有依赖项.美丽.

现在进行集成测试.让我们说在这种情况下,集成测试将测试这样的事情:

  1. 消息被放入队列中
  2. 消息被"处理"
  3. 响应消息放在响应队列中

我们还要说步骤2中发生的处理是严肃的事情.它依赖于大量的数据库交互,多个外部服务,文件系统,各种各样的东西.流会触发很多副作用,所以我不能简单地确保响应是正确的 - 我需要验证副作用.

这些依赖项中的每一个都由一个无状态服务类包装,这使得它们很好并且可以模拟.

人们如何处理这个?

我很想使用Mockito,这样我就可以验证上述流程会产生的副作用.然而,Mocktio的文档(在很大程度上它的实现)似乎强烈反对在"纯"单元测试之外的上下文中使用它.我试过这条路,但是

  • 填充存根数据很困难(因为它有很多)
  • 让Spring将那些存根实例注入我的bean很困难
  • 很难"重置"模拟,这样我就可以在不清除存根的情况下验证不同的交互集.

编辑

我知道我可以像HSQLDB实例那样处理数据库问题,但仍然存在外部服务的问题.为了重复性,我不能依赖那些服务,处于我需要的状态,等等.我看到的唯一选择是嘲笑它们.

Whatdaya呢?

integration-testing mocking mockito

37
推荐指数
2
解决办法
2万
查看次数

JUnit测试报告丰富了JavaDoc

对于客户,我们需要为集成测试生成详细的测试报告,这些测试报告不仅显示一切都是绿色的,而且还显示测试的内容.我和我的同事是懒惰的人,我们不想破解电子表格或文本文档.

为此,我想到了一种方法,可以使用每个@Test注释方法和每个测试类的JavaDoc注释来记录更复杂的集成测试.对于测试人员来说,查看哪些需求,Jira票证或测试链接到的任何内容以及测试实际尝试的内容都是一个很好的帮助.我们也想向客户提供这些信息.

现在最大的问题是:我们如何将每个方法和每个测试类的JavaDoc放入JUnit报告中?我们使用JUnit 4.9和Maven.

我知道,每个assertXXX()都有一个描述,但我们真的需要一个漂亮的HTML列表作为结果或PDF文档列出所有类和文档,下面是所有@Test方法及其描述,测试时间,结果如果失败,原因.

还是有另一种方法可以生成花哨的测试脚本吗?(或者我们应该在此开始一个OpenSource项目!?;-))

更新: 我问了另一个关于如何向Eclipse添加RunListener以使其在Eclipse启动时也在Eclipse中报告的问题.使用自定义TestRunner的建议解决方案是另一种获得测试结果报告的可能性.看看:如何在Eclipse中使用JUnit RunListener?

java junit integration-testing automated-tests unit-testing

36
推荐指数
2
解决办法
2万
查看次数