一站式做网站服务品牌网站建设推荐乐云seo

web/2025/10/9 7:32:25/文章来源:
一站式做网站服务,品牌网站建设推荐乐云seo,网站开发过程的基本环节,宜兴做网站哪个好如果您曾经编写过测试数据库交互的代码#xff0c;例如数据访问对象#xff0c;那么您很可能遇到了测试中最长期的烦恼之一#xff1a;为了准确地测试这些交互#xff0c;需要一个数据库。 为了本文的方便#xff0c;让我们考虑一个将PostgreSQL用作其环境的一部分的应用… 如果您曾经编写过测试数据库交互的代码例如数据访问对象那么您很可能遇到了测试中最长期的烦恼之一为了准确地测试这些交互需要一个数据库。 为了本文的方便让我们考虑一个将PostgreSQL用作其环境的一部分的应用程序因为这是示例所使用的。 同样尽管H2被广泛提及但这绝不是要贬低它的意思-在正确的位置使用它是一个很好的工具。 问题 已经提出了解决该问题的各种方法但是似乎总是存在一些缺点。 一种测试方法是使用内存数据库例如H2。 优点 数据库在虚拟机本地 数据库生命周期由构建过程管理 初始状态由构建过程或测试管理 缺点 您没有准确地对环境建模 并非支持生产数据库的所有功能 不同的数据类型意味着不同的列定义 涉及相同表的多个测试不能并行运行而不会产生冲突 如果您认为这些约束是不可接受的则可以考虑保留一个众所周知的正在运行的PostgreSQL数据库实例用于测试。 优点 与生产数据库100兼容 缺点 不保证初始数据状态 同一版本中涉及相同表的多个测试不能并行运行而不会产生冲突 并行构建可能导致结果不一致 运行本地测试的开发人员可能会破坏持续的集成构建 这种方法的进一步改进是使每个开发人员都拥有自己的PostgreSQL数据库实例。 优点 与生产数据库100兼容 开发人员构建不会干扰持续集成构建 缺点 不保证初始数据状态 同一版本中涉及相同表的多个测试不能并行运行而不会产生冲突 并行构建可能导致结果不一致 开发人员必须保持其数据库实例为最新或必须添加工具来对此进行管理 使用这些方法中的每一种我都认为不利之处足以部分或完全抵消优点。 外卖 分解最后三段我们可以看到以下功能是理想的 数据库应绑定到测试而不是虚拟机 这意味着现在可以进行测试并行化了 数据库生命周期应由内部版本管理 数据库应与生产中使用的数据库相同 我最喜欢的新解决方案 使用TestContainers 我们可以勾选每个功能。 使用JUnit Rule TestContainers将启动每个测试的Docker映像该映像提供一个寿命与测试一样长的数据库。 由于每个Docker实例都是完全隔离的因此可以并行运行测试以加快构建速度。 最后一点非常重要因为如上所述似乎总是存在一些缺点。 在这种情况下启动Docker映像及其包含的所有内容的开销将增加您的总体构建时间。 我会并且确实认为增加的测试时间几乎不会影响拥有我们所有所需功能的好处。 TestContainers开箱即用支持的每个数据库都有一个特定规则该规则可用于获取连接到数据库所需的所有详细信息。 public class FooDaoTest {Rulepublic PostgreSQLContainer postgres new PostgreSQLContainer();Beforepublic void setUp() {// populate database// postgres.getDriverClassName()// postgres.getJdbcUrl()// postgres.getUsername()// postgres.getPassword()} }或者... 根据文档 可以通过将JDBC URL更改为包含tc:来启动新容器例如jdbc:tc:postgresql://hostname/databasename 。 但是由于驱动程序中存在这一行 因此在我的应用程序中失败了。 if (!url.startsWith(jdbc:postgresql:)) { 轶事 在这里我花了10分钟时间将应用程序从使用H2切换为使用Dockerized PostgreSQL这使我的生活变得更加简单。 我们使用jOOQ进行数据库交互发现自己不得不删除一些非常好的jOOQ功能因为H2不支持它们。 让我重复一遍。 由于测试环境的限制我们面临着不断变化的生产代码 。 那是不可能的而且永远不会是一个可以接受的情况因此TestContainers的发现既是偶然的也是节省时间的。 太好了因为它确实提供了我们所需的东西但是省时 我刚才说这会增加测试时间怎么说呢 很简单–我不需要花时间查看是否有H2模式可以支持我正在使用的功能。 我发现自己写的代码以后必须删除因为H2不允许这样做 我可以编写测试和与DB相关的代码然后就完成了。 哇您没有提到Play的整个博客文章吗 不。 根据我刚刚提到的应用程序这是在Play上使用它的一种简便方法。 首先创建一个将TestContainer与Play的数据库支持结合在一起的mixin。 package be.objectify.tcexample.db;import com.google.common.collect.ImmutableMap; import org.testcontainers.containers.PostgreSQLContainer; import play.db.Database; import play.db.Databases; import play.db.evolutions.Evolutions;public interface DbTestSupport {default Database create(final PostgreSQLContainer postgres) throws Exception {final Database database Databases.createFrom(default,postgres.getDriverClassName(),postgres.getJdbcUrl(),ImmutableMap.of(username, postgres.getUsername(),password, postgres.getPassword()));Evolutions.applyEvolutions(database);return database;}default void destroy(final Database database) {Evolutions.cleanupEvolutions(database);database.shutdown();} } 我在这里使用mixin的原因是因为倾向于在接口旁边定义DAO测试-请参阅我的[上一篇文章]http://www.objectify.be/wordpress/2013/06/01/a-good-lazy-way -to-write-tests /。 如果可以将测试定义为mixins那就更好了因为可以将通用数据库设置代码放入一个通用类中然后可以将其扩展以实现测试mixins但是JUnit无法识别以这种方式定义的测试。 因此抽象测试类不知道它具有需要数据库的实现-它仅测试接口的约定。 package be.objectify.tcexample;import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat;public abstract AbstractUserDaoTest {Testpublic void testFoo() {assertThat(dao().something()).isEqualTo(whatever);}// many, many more testspublic abstract UserDao dao(); } 通过我们特定于数据库的实现作为后盾我们现在可以确保我们的实现按照合同要求的方式运行。 package be.objectify.tcexample.db;import be.objectify.tcexample.AbstractUserDaoTest; import be.objectify.tcexample.UserDao; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.testcontainers.containers.PostgreSQLContainer; import play.db.Database;public class JooqUserDaoTest extends AbstractUserDaoTest implements DbTestSupport,TestData {Rulepublic PostgreSQLContainer postgres new PostgreSQLContainer();private Database database;Beforepublic void setup() throws Exception {// the database has all evolutions applieddatabase create(postgres); // load some test dataloadTestData(database); }Afterpublic void tearDown() {destroy(database);}Overridepublic UserDao dao() {return new JooqUserDao(database);} } 现在我们的JooqUserDao实现将针对生产中使用的数据库类型的真实实例运行。 JooqUserDaoTest使用的TestData接口只是将某些数据加载到数据库中的另一个mixin。 实现并不是特别重要因为它很大程度上取决于您自己的要求但是它看起来可能像这样。 package be.objectify.tcexample.db;import org.jooq.impl.DSL; import play.db.Database;import java.sql.Connection; import java.sql.Timestamp; import java.time.Instant;import static be.objectify.tcexample.db.jooq.generated.Tables.ACCOUNT;public interface TestData {default void loadTestData(Database database) {database.withConnection((Connection conn) - {DSL.using(conn).insertInto(ACCOUNT,ACCOUNT.ID,ACCOUNT.KEY,ACCOUNT.CREATED_ON).values(1,test-account-a,Timestamp.from(Instant.now())).execute();DSL.using(conn).insertInto(ACCOUNT,ACCOUNT.ID,ACCOUNT.KEY,ACCOUNT.CREATED_ON).values(2,test-account-b,Timestamp.from(Instant.now())).execute();});} }翻译自: https://www.javacodegeeks.com/2017/03/database-testing-testcontainers.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/89507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业的手机价格网站建设wordpress 学习视频

文章目录 目录 文章目录 前言 一.变量 概述 定义 自定义变量 环境变量 概述: 定义环境变量: 位置变量 "$*"会把所有位置参数当成一个整体(或者说当成一个单词 变量的赋值和作用域 read 命令 变量和引号 变量的作用域 变…

网页设计作业视频网站如何免费建一个网站

思维导图文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary悲观锁悲观锁是平时开发中经常用到的一种锁,比如ReentrantLock和synchronized等就是这种思想的体现,它总是假设别的线程在拿线程的时候都会修…

wordpress做管理网站建设网站坪山

我这几天一直在看C#的书,知道了委托是怎么回事,但我一直不能理解这个委托是用在什么地方,有什么好处,请高手指点。 转载于:https://www.cnblogs.com/yjlft/archive/2006/04/03/365443.html

网站开发合作运营平台合同郑州定制网站推广工具产品

来源: 网易智能美国当地时间5月7日,硅谷无人车创业公司 Drive.ai 宣布将于2018年7月在德克萨斯州弗里斯科市提供自动驾驶汽车服务。这或许会成为美国第一个真正落地的自动驾驶汽车载人服务,也标志着公众第一次有机会在公共道路上使用按需定制…

建网站入门福建国通星驿网络科技有限公司

在数字化时代,电子元器件商城可以通过以下方式进行模式创新: 智能化搜索与推荐: 引入人工智能和机器学习技术,提供智能化搜索和个性化推荐功能,根据客户的需求和历史购买记录推荐相关的电子元器件,以提高购…

手机网站图片宽度有哪些网站可以兼职做笔译

目录 1.分支管理策略 2.我用的分支管理策略 3.一些常见问题 1.分支管理策略 分支管理策略就是一些经过实践后总结出来的可靠的分支管理的办法,让分支之间能科学合理、高效的进行协作,帮助我们在整个开发流程中合理的管理好代码版本。 目前有两套Git…

一个空间怎么放两个网站吗建设项目银行网站

背景: 在了解免费SSL证书和付费SSL证书的区别之前,先带大家了解一下SSL证书的概念和作用。 SSL证书的概念: SSL证书就是基于http超文本传输协议的延伸,在http访问的基础上增加了一个文本传输加密的协议,由于http是明…

建网站需要什么人常德小程序开发公司

文章目录 一、前言二、代码详解2.1、新起航迹2.2、预测2.3、匹配2.4、结果发布2.5、总结 三、流程图四、部署 一、前言 论文地址:https://arxiv.org/pdf/2110.06864.pdf git地址:https://github.com/ifzhang/ByteTrack ByteTrack 在是在 2021 年 10 月…

网站开发建设中企动力科技集团有限公司

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.选项卡是什么 二.选项卡在什么时候使用…

大公司网站建设建网站漳州seo网站快速排名

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

网站怎么才有alexa排名做的网站错位怎么办

一个网格通常具有许多的列(column)与行(row),以及行与行、列与列之间的间隙,这个间隙一般被称为沟槽(gutter)。 创建一个网格容器 display: grid;设置列 grid-template-columns: …

响应式网站模板多少钱天津网站制作报价

全世界只有3.14 % 的人关注了爆炸吧知识看着孩子的作业题,有多少爸爸妈妈感叹着,幸亏自己毕业早,要不然小学都不能毕业!这不,最近一道简单的小学数学题,又刷爆了家长们的朋友圈。一起往下看。算一算图中的这…

海拉尔做网站宁波网站建设信任蓉胜网络好

因为Linux Kernel 4.20默认启用了Spectre补丁STIBP,所以导致性能的下降,下降幅度甚至达到了50%,目前STIBP已经被移除,在最新发布的Linux Kernel 4.19.4、4.14.83内核当中已经移除了STIBP补丁。据称Linux Kernel 4.20就是启用了Spe…

seo怎么优化网站怀化建设公司网站

问题描述: 解题思路: 暴力超时,S变换得S a1*(a2.....an) a2*(a3....an) .... an-1*an。因此只需要求出括号内前缀和再相加求和即可。时间复杂度大大减小。 注意点:ans和前缀和的大小要开long long。 题解: #includ…

百度云建网站网站超市系统 源码

背景: 接口地址为:ws://sunlei.demo 接口说明:websocket接口,首次连接,通过Text请求设置开启标志,然后通过wav文件流传输,达到后端服务可以根据传输信息进行解析满足指定标准后,web…

杭州论坛网站建设小程序在线开发

时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-BiLSTM卷积双向长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍…

设计网站还有哪些问题全国做网站的大公司

目录 题目 背包状态转移方程 0-1背包 完全背包 解决方案 题目 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金…

优化网站页面网站定制化开发介绍

在众多视频整合项目中,一个显著的趋势是融合多元化的视频资源,以实现统一监管与灵活调度。这一需求促使项目团队不断探索新的集成方案,确保不同来源的视频流能够无缝对接,共同服务于统一的调看与管理平台,进而提升整体…

阿里云可以建设网站吗宁德企业网站建设

文章目录 云计算的演进云原生架构1. 容器化2. 微服务3. 自动化部署和扩展4. 故障恢复 自动化运维1. 基础设施即代码(IaC)2. 运维自动化示例:使用Ansible自动化配置管理 3. 自动化监控和报警 未来展望1. 更多的自动化2. 多云混合云3. 边缘计算…