小编Pet*_*ete的帖子

模块化应用程序堆栈中的虚拟数据和单元测试策略

如何管理用于测试的虚拟数据?将它们与各自的实体保持一致?在一个单独的测试项目中?使用外部资源的Serializer加载它们?或者只是在需要的地方重新创建它们?

我们有一个应用程序堆栈,其中包含多个模块,具体取决于另一个模块.每个模块都有自己的测试,需要运行虚拟数据.

现在,具有大量依赖性的模块将需要来自其他模块的大量虚拟数据.然而,那些不发布它们的虚拟对象,因为它们是测试资源的一部分,因此所有模块必须一次又一次地设置它们需要的所有虚拟对象.

另外:我们实体中的大多数字段都不可为空,因此即使针对对象层运行事务也要求它们包含一些值,大多数情况下还有其他限制,如唯一性,长度等.

是否有最佳实践方法或所有解决方案都妥协?


更多详情

我们的堆栈看起来像这样:

一个模块:

src/main/java --> gets jared (.../entities/*.java contains the entities)
src/main/resources --> gets jared
src/test/java --> contains dummy object setup, will NOT get jared
src/test/resources --> not jared
Run Code Online (Sandbox Code Playgroud)

我们使用Maven来处理依赖关系.

模块示例:

  • 模块A有一些虚拟对象
  • 模块B需要自己的对象,与模块A相同

选项a)

测试模块T可以容纳所有虚拟对象,并将它们提供给所有模块中的所有测试中的测试范围(因此加载的依赖关系不会受到影响).那会有用吗?含义:如果我加载牛逼一个并运行安装在一个将它不含有引入引用牛逼特别是没有B?然而A会知道B的数据模型.

选项b)

模块A在某处提供虚拟对象,src/main/java../entities/dummy允许B获取它们,而A不知道B的虚拟数据

选项c)

每个模块都包含外部资源,它们是序列化的虚拟对象.它们可以由需要它们的测试环境反序列化,因为它依赖于它们所属的模块.这将需要每个模块创建和序列化其虚拟对象,以及如何做到这一点?如果使用另一个单元测试,它会引入不应该发生的单元测试之间的依赖关系,或者使用脚本,它将很难调试而且不灵活.

选项d)

使用模拟框架并根据需要手动为每个测试分配必需的字段.这里的问题是我们实体中的大多数字段都不可为空,因此需要调用setter或构造函数,这将使我们在开始时再次结束.

我们不想要的

我们不希望使用静态数据设置静态数据库,因为所需对象的结构将不断变化.很多,现在,稍晚一点.所以我们希望hibernate设置所有表和列,并在单元测试时填充数据.静态数据库也会引入许多潜在错误并测试相互依赖性.


我的想法是否朝着正确的方向发展?处理需要大量数据的测试的最佳做法是什么?我们将有几个相互依赖的模块,它们需要填充来自其他几个模块的某种数据的对象.


编辑

关于我们现在如何回应第二个答案的更多信息:

所以为了简单起见,我们有三个模块:Person, …

java testing unit-testing modular maven

10
推荐指数
1
解决办法
6711
查看次数

寻找涵盖单元,功能,集成和场景测试的综合Java测试书

我们正在使用java开发一个数据量很大的模块化Web应用程序堆栈,但对测试几乎没有专业知识.我们目前所做的是使用JUnit运行单元测试和功能测试的混合.我在这里更详细地描述了这个问题.

现在我们决定在早期建立标准,关于如何测试我们的模块和应用程序,因此我们需要阅读一般的测试原理和最佳实践,特别是在java spring环境中.

我想要介绍的是从单元测试到场景测试的各种测试背后定义,用例和推理,或谷歌称之为:小型,中型,大型测试.就像我说的,我们正在开发一个数据量很大的Web应用程序.

我希望能够从书中推断出每个测试阶段对我们的应用程序的相应级别(核心,数据库访问,安全模块,实体管理器,Web模型,Web控制器,Web-)的必要性和有用性.视图)

如果书中的示例直接适用于我们的应用程序堆栈,那将是很好的.我们使用spring,JPA(休眠),JSF,spring security.到目前为止测试我们使用的是基本的Junit和一些powermock.因此,JBOSS,Seam或Java Enterprise书籍并不那么有用.

如果网上有精彩的文章描绘了一幅清晰的图片并且真的有所帮助,请随意分享这些文章(我可以自己使用google,SO和wiki,所以请只阅读你真正阅读并认为非常有帮助的文章),但是一本书会很好,所以我可以从基础知识中读出来,而不必从各种文章和问题中将它们拼凑起来.

谢谢!

编辑 - 我们订购的书籍

刚开始阅读 以测试为导向的面向对象的增长软件,我已经非常喜欢它了.不是针对初学者,而是展示如何使用敏捷技术开发测试.真正清理旧的软件开发思路.

我们还订购了xUnit测试模式:重构测试代码,以了解如何最好地单元测试应用程序堆栈中的不同区域.得到了两次推荐,所以我希望它会有所帮助.

java testing integration-testing unit-testing functional-testing

10
推荐指数
1
解决办法
9120
查看次数

将JBehave与SpringJUnit4ClassRunner相结合以启用事务回滚

本质:

如何在JBehave的JUnit Test运行中自动回滚我的hibernate事务

问题似乎是JBehave想要SpringAnnotatedEmbedderRunner@Transactional需要注释一个测试SpringJUnit4ClassRunner.

我试图找到一些关于如何实现回滚SpringAnnotatedEmbedderRunner或使JBehave使用的文档,SpringJUnit4ClassRunner但我无法工作.

有没有人有一个(最好是简单的)设置运行JBehave与Spring和Hibernate和事务自动回滚的存储?



到目前为止关于我的设置的更多信息:

使用Spring工作JBehave - 但不使用自动回滚:

@RunWith(SpringAnnotatedEmbedderRunner.class)
@Configure(parameterConverters = ParameterConverters.EnumConverter.class)
@UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = false, ignoreFailureInView = false)
@UsingSpring(resources = { "file:src/main/webapp/WEB-INF/test-context.xml" })
@UsingSteps
@Transactional // << won't work
@TransactionConfiguration(...) // << won't work
// both require the SpringJUnit4ClassRunner 

public class DwStoryTests extends JUnitStories {

    protected List<String> storyPaths() {

        String searchInDirectory = CodeLocations.codeLocationFromPath("src/test/resources").getFile();
        return new StoryFinder().findPaths(searchInDirectory, …
Run Code Online (Sandbox Code Playgroud)

java junit spring hibernate jbehave

9
推荐指数
1
解决办法
4674
查看次数

Spring-Test-MVC/MockServletContext - 测试中的内容为空,但在Tomcat上工作

我们正在尝试为Spring-MVC Web应用程序设置Spring-Test-MVC.我们开始使用freemarker,一切都很好.我们决定反对它,现在正试图用JSP进行设置.当测试应用程序部署在Tomcat上时,它正在运行.当我们运行简单测试时:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebContextLoader.class, locations = { "file:src/main/webapp/WEB-INF/servlet-context.xml" })
public class SkelletonTest {

    @Inject
    private MockMvc mockMvc;

    @Test
    public void homeTest() throws Exception {
        mockMvc.perform(get("/")).andExpect(status().isOk())
                .andExpect(content().type("text/html;charset=ISO-8859-1"))
                .andExpect(content().string(containsString("Hello World!")));
    }
Run Code Online (Sandbox Code Playgroud)

它说:content type not set或者如果删除它,内容将是空的.然而,控制器将被调用,因此映射必须起作用.

所以这强烈暗示我们的测试没有呈现视图,但我不知道我可能缺少什么设置.

这是我们的servlet-context.xml:

<context:component-scan base-package="package.to.controllers" />
<mvc:annotation-driven />

<bean id="viewResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="exposeContextBeansAsAttributes" value="true" />
    <property name="prefix" value="/views/" />
    <property name="suffix" value=".jsp" />
</bean>
Run Code Online (Sandbox Code Playgroud)

WebContextLoader:

public class WebContextLoader extends GenericWebContextLoader {
    public WebContextLoader() {
        super("src/main/webapp", false);
    }
}
Run Code Online (Sandbox Code Playgroud)

GenericWebContextLoader是spring-test-mvc的原始版本. …

java testing servlets mocking spring-mvc

8
推荐指数
2
解决办法
9337
查看次数

如何单元测试传入的Jersey MultiPart请求的处理

我们有一个REST服务,它接受包含该hold 的MultiPart POST请求.在REST服务内部,可以根据提供的数据创建文件.BodyPartsInputStream

任务

我们希望根据其MultiPart输入对执行文件操作的类进行单元测试.注意:Wo不想使用Jersey-Test!Grizzly没有加载我们需要将DAO和fileHandler服务注入REST服务类的spring应用程序上下文.我们明确要测试我们的fileHandler服务如何处理multiPart数据.

然而问题是,MultiPartREST客户端发出的内容与REST服务器收到的内容不同,因为泽西可能会对数据进行流式传输或其他任何操作.尝试测试(见下文)以下设置将导致

IllegalArgumentException [B cannot be cast to com.sun.jersey.multipart.BodyPartEntity
Run Code Online (Sandbox Code Playgroud)

REST客户端 - 发送MultiPart

(只是片段,我省略了明显的东西):

    byte[] bytes = FileManager.readImageFileToArray(completePath, fileType);

    MultiPart multiPart = new MultiPart().
            bodyPart(new BodyPart(bytes, MediaType.APPLICATION_OCTET_STREAM_TYPE)).
            bodyPart(new BodyPart(fileName, MediaType.APPLICATION_XML_TYPE)).
            bodyPart(new BodyPart(senderId, MediaType.APPLICATION_XML_TYPE));

    ClientConfig cc = new DefaultClientConfig();
    cc.getClasses().add(MultiPartWriter.class);
    Client client = Client.create(cc);
    WebResource webResource = client.resource(requestUrl);
    Builder builder = webResource.type(MediaType.MULTIPART_FORM_DATA_TYPE);
    builder = addHeaderParams(builder, headerParams);

    ClientResponse response = builder.post(ClientResponse.class, …
Run Code Online (Sandbox Code Playgroud)

java testing rest multipart jersey

8
推荐指数
1
解决办法
4546
查看次数

防止 spring-rabbit 中的 @RabbitListener 在集成测试期间尝试连接到服务器

我想为我使用 rabbitMq 的服务运行一些验收测试,但我想忽略所有需要服务间通信 (amqp) 的服务。

然而,问题是 Spring 尝试在启动时连接到(不存在的)rabbit 主机,以便它可以注册其使用者。它对每个注释的方法都@RabbitListener这样做,如果我的服务中有多个侦听器,这可能会因长时间超时而变得非常烦人。

我怎样才能减少这个超时甚至一起阻止@RabbitListener 连接?

我们的(简化的)Rabbit 配置:

@Configuration
@EnableRabbit
public class RabbitMqConfig {

    public RabbitMqConfig(
            @Value("${rabbitmq.host}") String rabbitHost,
            @Value("${rabbitmq.port}") int rabbitPort,
            @Value("${exchange.name}") String exchange) {
        this.rabbitHost = rabbitHost;
        this.rabbitPort = rabbitPort;
        this.exchange= exchange;
    }

  @Bean
  DirectExchange directExchangeBean() {
    return new DirectExchange(this.exchange, true, false);
  }

  @Bean
  public ConnectionFactory connectionFactory() {
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(rabbitHost);
    connectionFactory.setPort(rabbitPort);
    return connectionFactory;
  }

  @Bean
  public RabbitTemplate rabbitTemplate() {
    return new RabbitTemplate(connectionFactory());
  }


  @Bean
  public Queue itemDoneQueue() { …
Run Code Online (Sandbox Code Playgroud)

java spring rabbitmq spring-rabbit

8
推荐指数
2
解决办法
9952
查看次数

删除"集成测试骗局" - 了解协作和合同测试

我最近看过集成测试是 JB Rainsberger 的骗局,我现在正在寻找关于这个主题的更多资料.我不得不说,我对我们做错了多少感到震惊(即我们应该进行单元测试的集成测试),对Rainsberger描述的概念很感兴趣,但也对如何应用它们感到困惑.我想有更多描述的协作测试和合同测试,但我不知道从哪里开始.

唯一困扰我的是测试需要提出的4个问题:

A面:

Do I ask the right question?
Can I deal with the answer?
Run Code Online (Sandbox Code Playgroud)

B面:

Can I answer a question?
Do I answer correctly?
Run Code Online (Sandbox Code Playgroud)

但是我如何将它应用于我的应用程序堆栈中的一些随机方法?

是否有一本书或教程或示例,它们采用了一个真实世界的例子并应用了这些孤立微测试的想法?理想情况下,该示例使用Java,C#或C++.

任何涉及这些概念的文献总体上可以帮助我更好地理解它们.

此外,如果有论坛,我可以询问有关如何进行正确的单元测试的更详细的问题,甚至可能重构现有的代码和帖子示例会很好.

谢谢!

collaboration testing integration-testing unit-testing contract

7
推荐指数
1
解决办法
1330
查看次数

接口,即使不是所有实现都使用所有方法?

我对接口编程相当新,并试图将其作为开发测试驱动的主要工具.

目前我们有很多Manager类都实现了CRUD接口.但是有些经理还没有做更新,有些不做删除,有些可能永远不会做.


没有实现异常?

是没关系,只是

throw new NotImplementedException()
Run Code Online (Sandbox Code Playgroud)

直到该方法得到实施,或者甚至是永远都没有?

(显然有一个源代码注释告诉程序员"不应该使用这种方法,例如像'男'女'那样的类型永远不会被删除)?


分裂?

或者我应该将我的CRUD界面拆分为可创建,可读(可搜索),可更新和可删除?这不会弄乱我的班级定义吗?

PersonManager implements Creatable<Person>, Updateable<Person>, Deletable<Person>, Searchable<Person>
Run Code Online (Sandbox Code Playgroud)

拆分并结合?

或者我应该将所有4个接口组合到CRUD中,还是其他一些组合,如Read + Update?

也许这也会创建一个接口加载,人们必须通过一个大的继承路径来找出哪个接口为当前情况实现所有所需的原子接口(我需要读取和创建,所以哪一个只实现了两个?这可以快速复杂得多)

java implementation interface

7
推荐指数
2
解决办法
1785
查看次数

Jenkins禁用或清除maven版本的缓存

我们的maven项目都建立在jenkins之上,然后将工件部署到maven存储库.

但是出于某种原因,在构建一个与刚刚构建的其他项目有依赖关系的项目时,似乎存在某种缓存或更新延迟.

假设工件A和B中存在一个错误取决于A.现在我在本地修复错误,在B中更新我的依赖关系,运行B,一切都很好.我明显检查了.现在我在Jenkins上建立A,之后是B.然后我得到新建的B并运行它.这个bug仍然存在.几个小时后,如果我再次建立B,它将会得到新的A并且错误消失了......

所以必须有办法迫使詹金斯在其服务器上使用新的A. 使用mvn -umvn --update-snapshots不会帮助.它将检查更新并找不到..

dependencies caching maven jenkins

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

用于内部REST通信的OAuth + spring安全性

建立

我们正在使用Java和Spring开发分布式应用程序,其中我们现有的客户端前端(包括自己的身份验证,数据库,帐户等)使用REST调用来访问我们的新服务器以获取其他服务.我们想用Oauth保护这些资源.

访问权限应受角色或帐户的限制.但是,除了现有帐户之外,我们不希望客户端上的用户担心任何其他身份验证.同时,我们需要为第三方应用程序提供一种方法,以便在对服务器进行某种注册后从外部访问某些资源(这就是我们首先分发的原因).

因此,我们在服务器端设置了spring security,以提供应该用于限制对资源的访问的帐户.该用户应登录客户端上,然后只能够访问这些服务器资源分配给他.我们有一些注册过程,在客户端设置用户以便能够访问服务器服务,因此我认为应该在那里进行任何帐户设置.

所以问题是

如何让客户端获取受保护资源的访问令牌,而无需用户登录其服务器端帐户?

如何在不需要任何用户输入的情况下设置服务器端帐户?

我的想法

这不行

我想我要告诉客户一个在服务器端为该用户创建的新帐户(但是,我将如何选择和传递密码?)或将客户端帐户同步到服务器,以及使用这些凭据来针对服务器对客户端进行身份验证并生成访问令牌.但是这可以节省多少?此外,服务器在其帐户上具有更高的安全性(单向加密,盐渍密码),我真的不想通过使用较少保存的客户端帐户来妥协.

也许这会吗?

也许要走的路是在第一次身份验证期间告诉服务器有关客户端帐户的信息,在服务器端创建一个帐户,在客户端存储生成的令牌,然后针对服务器使用该令牌为每个后续服务器验证客户端请求..?服务器是否能够通过该令牌为每个请求使用其服务器端帐户登录客户端?我需要一个特殊的资源用于初始(2条腿?)握手,只能从客户端服务器访问,对吧?

另外:哪个更适合OAuth 1或2的任务?

我希望有人能理解我的问题并帮助我解决可能的误解和知识差距(我现在正在阅读Oauth和Spring安全文档,所以如果我想出更清晰的图片,那么我会更新该做什么)

谢谢你的帮助!

java rest oauth spring-security oauth-2.0

7
推荐指数
1
解决办法
3065
查看次数