标签: integration-testing

如何让Capybara在Cucumber功能中执行DELETE请求?

我正在使用Cucumber和Capybara.我需要发出HTTP DELETE请求.以前使用webrat的功能,所以简单的声明就好

visit "/comment/" + comment_id, :delete
Run Code Online (Sandbox Code Playgroud)

工作,但现在我使用Capybara.

做一个GET请求的方法很简单:

get 'path'
Run Code Online (Sandbox Code Playgroud)

并做一个帖子请求:

page.driver.post 'path'
Run Code Online (Sandbox Code Playgroud)

但是我如何模拟DELETE请求呢?

我发现司机Capybara正在使用的是Capybara::RackTest::Driver,如果有任何帮助的话.

我也尝试过:

Capybara.current_session.driver.delete "/comments/" + comment_id
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

integration-testing ruby-on-rails cucumber capybara

22
推荐指数
2
解决办法
7828
查看次数

在应用程序启动之前配置@MockBean组件

我有一个Spring Boot 1.4.2应用程序.在启动期间使用的一些代码如下所示:

@Component 
class SystemTypeDetector{
    public enum SystemType{ TYPE_A, TYPE_B, TYPE_C }
    public SystemType getSystemType(){ return ... }
}

@Component 
public class SomeOtherComponent{
    @Autowired 
    private SystemTypeDetector systemTypeDetector;
    @PostConstruct 
    public void startup(){
        switch(systemTypeDetector.getSystemType()){   // <-- NPE here in test
        case TYPE_A: ...
        case TYPE_B: ...
        case TYPE_C: ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有一个组件可以确定系统类型.在从其他组件启动期间使用此组件.在生产中一切正常.

现在我想使用Spring 1.4的@MockBean添加一些集成测试.

测试看起来像这样:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyWebApplication.class, webEnvironment = RANDOM_PORT)
public class IntegrationTestNrOne {
    @MockBean 
    private SystemTypeDetector systemTypeDetectorMock;

    @Before 
    public void initMock(){
       Mockito.when(systemTypeDetectorMock.getSystemType()).thenReturn(TYPE_C);
    }

    @Test 
    public void testNrOne(){ …
Run Code Online (Sandbox Code Playgroud)

java spring integration-testing mocking spring-boot

22
推荐指数
3
解决办法
5286
查看次数

如何进行集成测试?

有关单元测试的文章很多,但我几乎没有找到任何有关集成测试的书籍/博客?能否请您就此主题向我推荐一些内容?

进行集成测试时要编写哪些测试?什么是良好的集成测试?等等

谢谢

language-agnostic testing integration-testing

21
推荐指数
2
解决办法
1891
查看次数

集成测试最佳实践

我们的团队有数百个集成测试,可以访问数据库并验证结果.我有两个基类用于所有集成测试,一个用于仅检索测试,一个用于创建/更新/删除测试.仅检索基类在TestFixtureSetup期间重新生成数据库,因此每个测试类只执行一次.CUD基类在每次测试之前重新生成数据库.每个存储库类都有自己的相应测试类.

可以想象,整个过程需要相当长的时间(接近7-8分钟才能运行并快速增长).将此运行作为我们的CI(CruiseControl.Net)的一部分运行不是问题,但在本地运行需要很长时间,并且在提交代码之前确实禁止运行它们.

我的问题是,是否有任何最佳实践可以帮助加快这些类型的集成测试的执行速度?

我无法在内存中执行它们(la sqlite),因为我们使用sqlite不支持的某些特定于数据库的功能(计算列等).

此外,整个团队必须能够执行它们,因此在SQL Server Express的本地实例上运行它们可能容易出错,除非这些实例的连接字符串完全相同.

你是如何在你的店里完成这项工作的,哪些方面有效?

谢谢!

integration-testing

20
推荐指数
3
解决办法
1万
查看次数

公共SFTP测试服务器的地址

在我的应用程序中,我想从SFTP服务器下载文件,为此我写了一个程序,但现在我想测试它是否正常工作.所以我需要一个公共SFTP服务器,以便从中下载任何文件.我知道公共FTP服务器,但不知道任何SFTP服务器.那么有谁能知道这样的SFTP服务器?

sftp integration-testing

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

如何在集成测试中使用Propagation.REQUIRES_NEW回滚嵌套事务

我对扩展以下基类的各种服务进行了多次集成测试:

@ContextConfiguration(locations="classpath:applicationContext-test.xml")
@TransactionConfiguration(transactionManager="txManager", defaultRollback=true)
@Transactional
public abstract class IntegrationTestBase extends AbstractTransactionalJUnit4SpringContextTests
{
    //Some setup, filling test data to a HSQLDB-database etc
}
Run Code Online (Sandbox Code Playgroud)

对于大多数情况,这工作正常,但我有一个服务类,其中定义了事务propagation=Propagation.REQUIRES_NEW.似乎这些事务没有回滚(因为它们是嵌套事务并且显然在"外部"事务中提交?).回滚"外部"(测试用例级别)事务,至少根据测试日志.提交的事务会使一些后续测试陷入混乱,因为它们已经更改了测试数据.

我可以通过强制测试在测试之间重新创建和重新填充数据库来解决这个问题,但我的问题是,这是预期的行为还是我在测试中做错了什么?是否可以强制嵌套事务从测试代码回滚?

spring integration-testing hibernate transactions rollback

20
推荐指数
2
解决办法
7935
查看次数

Ruby的VCR库是否有python替代品?

我想使用Ruby的VCR库Betamax的令人敬畏的"记录/回放"机制用于JVM.是否有一个Python库以相同的方式工作?如果没有,您如何测试您的REST客户端调用,而不必担心测试缓慢和片状?

python testing integration-testing vcr

20
推荐指数
2
解决办法
2283
查看次数

使用spring security进行集成测试

我需要向API发送一个get请求,但是尽管已经放置了管理员注释获取错误 @WithMockUser(roles="ADMINISTRADOR").
我如何发送请求?

API

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@PostAuthorize("returnObject.instancia == principal.instancia.instancia")
public Validacao retrieve(@PathVariable("id") String id) {
    return validacaoService.retrieve(id);
}
Run Code Online (Sandbox Code Playgroud)

测试

@Test
@WithMockUser(roles = "ADMINISTRADOR")
public void testCRetrieve() throws Exception {
        this.mockMvc
                .perform(get("/api/validacao/" + id).with(user("daniela.morais@sofist.com.br")))
                .andExpect(status().isOk())
                .andReturn();
}
Run Code Online (Sandbox Code Playgroud)

日志

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
Run Code Online (Sandbox Code Playgroud)

测试类

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {ValidacaoAPITest.TestConfiguration.class, WithSecurityConfig.class})
@WebAppConfiguration
public class ValidacaoAPITest {
    @EnableWebMvc
    @Configuration
    public static class TestConfiguration {
        Fongo …
Run Code Online (Sandbox Code Playgroud)

java integration-testing spring-mvc spring-security

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

有没有办法在运行所有测试后执行拆卸功能?

在 Rust 中,有没有办法在使用标准测试库运行所有测试后(即在cargo test.

我不打算在每次测试后运行拆卸功能,因为它们已在这些相关帖子中讨论过:

这些讨论了运行的想法:

一种解决方法是环绕cargo test调用的 shell 脚本,但我仍然很好奇上述方法是否可行。

testing integration-testing unit-testing rust teardown

20
推荐指数
1
解决办法
2142
查看次数

模拟单元测试中的时间流逝

我为客户建立了一个付费的CMS +发票系统,我需要对我的测试更加严格.

我将所有数据保存在Django ORM中,并且有一堆Celery任务以不同的时间间隔运行,以确保在用户不支付发票时发送新发票和发票提醒并减少访问权限.

例如,我希望能够运行以下测试:

  1. 创建新用户并为X天访问该站点生成发票

  2. 模拟X + 1天的传递,并运行我在Celery中设置的所有任务.

  3. 检查是否已向用户发出其他X天的新发票.

到目前为止我提出的KISS方法是在一台单独的机器上进行所有测试,并实际操作操作系统级别的日期/时间.所以测试脚本会:

  1. 将系统日期设置为第1天

  2. 创建新用户并为X天访问生成第一张发票

  3. 提前系统日期1天.运行我所有的芹菜任务.重复直到X + 1天"通过"

  4. 检查是否已签发新发票

它有点笨重,但我认为它可能会奏效.关于如何完成它的任何其他想法?

python testing integration-testing mocking celery

19
推荐指数
1
解决办法
2747
查看次数