当前位置: 首页 > news >正文

如何建立自己的摄影网站江西网站建设平台

如何建立自己的摄影网站,江西网站建设平台,襄阳品牌网站建设,做网站需要每年交钱吗赞扬别人团建评论开发人员的测试工具箱就是其中之一#xff0c;很少保持不变。 可以肯定的是#xff0c;一些测试实践已被证明比其他测试更有价值#xff0c;但是#xff0c;我们仍在不断寻找更好#xff0c;更快和更具表现力的方法来测试我们的代码。 基于属性的测试 是 … 赞扬别人团建评论 开发人员的测试工具箱就是其中之一很少保持不变。 可以肯定的是一些测试实践已被证明比其他测试更有价值但是我们仍在不断寻找更好更快和更具表现力的方法来测试我们的代码。 基于属性的测试 是 Java社区中鲜为人知的 这是Haskell员工精心制作的另一种瑰宝并在QuickCheck论文中进行了介绍 。 Scala社区诞生了ScalaCheck库的Scala社区和许多其他组织很快意识到了这种测试技术的强大功能但是Java生态系统在相当长的一段时间内一直缺乏采用基于属性的测试的兴趣。 幸运的是自从jqwik出现以来情况就在慢慢变化 以求更好。 对于许多人来说很难掌握什么是基于属性的测试以及如何利用它。 杰西卡·克尔 Jessica Kerr的精彩演讲《基于属性的测试更好的代码》 以及有关基于属性的测试的简介基于 属性的测试模式系列的文章是吸引您的绝佳来源但是在今天的帖子中我们将尝试发现典型的Java开发人员使用jqwik进行的基于属性的测试的实践方面。 首先 基于属性的测试名称实际上意味着什么 每个Java开发人员首先想到的是它旨在测试所有的getter和setters您好100覆盖率吗 并非如此尽管对于某些数据结构而言可能很有用。 相反我们应该确定组件数据结构甚至单个功能的高级特性 并通过提出假设有效地对其进行检验。 我们的第一个示例属于“那里又回来”类别将序列化和反序列化为JSON表示形式。 被测试的类是User POJO 虽然很简单但请注意它具有OffsetDateTime类型的一个时间属性。 public class User { private String username; JsonFormat (pattern yyyy-MM-ddTHH:mm:ss[.SSS[SSS]]XXX , shape Shape.STRING) private OffsetDateTime created;     // ... } 令人惊讶的是由于所有人都在尝试使用自己的表示形式因此最近几天使用日期/时间属性进行操作会引起问题。 如您所见我们的合同使用的是ISO-8601互换格式带有可选的毫秒部分。 我们要确保的是可以将任何有效的User实例序列化为JSON 然后反序列化为Java对象而不会失去任何日期/时间精度。 作为练习让我们尝试首先用伪代码来表达它 For any user Serialize user instance to JSON Deserialize user instance back from JSON Two user instances must be identical 看起来很简单但令人惊讶的部分出在这里让我们看一下如何使用jqwik库将此伪代码投影到真实的测试用例中。 它尽可能地接近我们的伪代码。 Property void ForAll serdes( ForAll ( users ) User user) throws JsonProcessingException { final String json serdes.serialize(user); assertThat(serdes.deserialize(json)) .satisfies(other - { assertThat(user.getUsername()).isEqualTo(other.getUsername()); assertThat(user.getCreated().isEqual(other.getCreated())).isTrue(); });         Statistics.collect(user.getCreated().getOffset()); } 测试用例读起来很简单通常是自然的但是显然 jqwik的Property和ForAll批注后面隐藏着一些背景。 让我们从ForAll开始并清除所有这些User实例的来源。 您可能猜到了这些实例必须生成最好以随机方式生成。 对于大多数内置数据类型 jqwik具有一组丰富的数据提供程序 Arbitraries 但是由于我们要处理特定于应用程序的类因此我们必须提供自己的生成策略。 它应该能够发出具有广泛的用户名以及不同时区和偏移量集合的日期/时刻的User类实例。 首先让我们先略过提供者的实现然后再详细讨论。 Provide ArbitraryUser users() { final ArbitraryString usernames Arbitraries.strings().alpha().ofMaxLength( 64 );  final ArbitraryOffsetDateTime dates Arbitraries .of(List.copyOf(ZoneId.getAvailableZoneIds())) .flatMap(zone - Arbitraries .longs() .between(1266258398000L, 1897410427000L) // ~ /- 10 years .unique() .map(epochMilli - Instant.ofEpochMilli(epochMilli)) .map(instant - OffsetDateTime.from(instant.atZone(ZoneId.of(zone))))); return Combinators .combine(usernames, dates) .as((username, created) - new User(username).created(created)); } 用户名的来源很简单只是随机字符串。 日期的来源基本上可以是2010年到2030年之间的任何日期/时间而时区部分因此是偏移量是从所有可用的基于区域的区域标识符中随机选择的。 例如下面是jqwik提出的一些示例。 { username : zrAazzaDZ , created : 2020-05-06T01:36:07.49649603:00 } { username : AZztZaZZWAaNaqagPLzZiz , created : 2023-03-20T00:48:22.73773708:00 } { username : aazGZZzaoAAEAGZUIzaaDEm , created : 2019-03-12T08:22:12.65865804:00 } { username : Ezw , created : 2011-10-28T08:07:33.542542Z } { username : AFaAzaOLAZOjsZqlaZZixZaZzyZzxrda , created : 2022-07-09T14:04:20.84984902:00 } { username : aaYeZzkhAzAazJ , created : 2016-07-22T22:20:25.16216206:00 } { username : BzkoNGzBcaWcrDaaazzCZAaaPd , created : 2020-08-12T22:23:56.90290208:45 } { username : MazNzaTZZAEhXoz , created : 2027-09-26T17:12:34.87287211:00 } { username : zqZzZYamO , created : 2023-01-10T03:16:41.879879-03:00 } { username : GaaUazzldqGJZsqksRZuaNAqzANLAAlj , created : 2015-03-19T04:16:24.098098Z } ... 默认情况下 jqwik将针对1000套不同的参数值随机用户实例运行测试。 非常有用的“ 统计”容器允许收集您好奇的任何分布见解。 以防万一为什么不按区域偏移量收集分布呢 ... - 04 : 00 ( 94 ) : 9.40 % - 03 : 00 ( 76 ) : 7.60 % 02 : 00 ( 75 ) : 7.50 % - 05 : 00 ( 74 ) : 7.40 % 01 : 00 ( 72 ) : 7.20 % 03 : 00 ( 69 ) : 6.90 % Z ( 62 ) : 6.20 % - 06 : 00 ( 54 ) : 5.40 % 11 : 00 ( 42 ) : 4.20 % - 07 : 00 ( 39 ) : 3.90 % 08 : 00 ( 37 ) : 3.70 % 07 : 00 ( 34 ) : 3.40 % 10 : 00 ( 34 ) : 3.40 % 06 : 00 ( 26 ) : 2.60 % 12 : 00 ( 23 ) : 2.30 % 05 : 00 ( 23 ) : 2.30 % - 08 : 00 ( 20 ) : 2.00 % ... 让我们考虑另一个例子。 想象一下我们决定基于用户名属性重新实现User类的相等性在Java中这意味着重写equals和hashCode 。 这样对于任何一对User类实例以下不变量必须为true 如果两个User实例具有相同的用户名 则它们相等并且必须具有相同的哈希码 如果两个User实例具有不同的username 则它们不相等但哈希码不一定相同 它非常适合基于属性的测试并且jqwik尤其使这种测试的编写和维护变得微不足道。 Provide ArbitraryltString usernames() { return Arbitraries.strings().alpha().ofMaxLength( 64 ); } Property void equals( ForAll ( usernames ) String username, ForAll ( usernames ) String other) { Assume.that(!username.equals(other));         assertThat( new User(username)) .isEqualTo( new User(username)) .isNotEqualTo( new User(other)) .extracting(User::hashCode) .isEqualTo( new User(username).hashCode()); } 由于我们引入了用户名的两个来源因此通过假设表达的假设允许对生成的参数施加额外的约束这可能会发生因为它们在同一运行中都发出相同的用户名因此测试将失败。 您到目前为止可能遇到的问题是重点是什么 当然可以在不进行基于属性的测试和使用jqwik的情况下测试序列化/反序列化或equals / hashCode 那么为什么还要麻烦呢 足够公平但是这个问题的答案基本上深深在于我们如何进行软件系统的设计。 总体而言 基于属性的测试在很大程度上受函数式编程的影响这并不是Java的第一件事至少现在还不是这要轻描淡写地说。 随机生成测试数据本身并不是一个新颖的主意但是至少在我看来 基于属性的测试鼓励您去做的是以更抽象的角度思考而不是专注于单个操作等于比较加法。 排序序列化...但是它们要遵循什么样的属性特征定律和/或不变式。 当然这感觉就像是一种外来技术如果您愿意的话可以改变范式鼓励您花更多的时间设计正确的东西。 这并不意味着从现在开始您的所有测试都必须基于属性但是我相信它当然应该在我们的测试工具箱的前排位置。 请在Github上找到完整的项目资源。 翻译自: https://www.javacodegeeks.com/2020/02/in-praise-of-the-thoughful-design-how-property-based-testing-helps-me-to-be-a-better-developer.html赞扬别人团建评论
http://www.pierceye.com/news/622001/

相关文章:

  • php企业门户网站陕西高速公路建设网站
  • 网站商城系统建设方案h5页面制作网站易企秀
  • 绍兴网站建设方案报价seo外贸网站
  • 物流网站建设重要性建筑公司网址大全
  • 腾讯云注册域名后怎么做网站郑州网站建设大华伟业
  • 哪个小说网站可以做封面中国软件园排名前十
  • 门户网站建设预算表十大软件免费下载安装手机版
  • 河南省安阳市建设银行网站wordpress会员卡
  • 旅游类网站怎么做网站前端设计
  • 涉县网站设计商城网站建设推荐
  • 网站注册了域名然后怎么做网站运维是做什么的
  • 深圳学校网站建设哪家好企业宣传网
  • 静态网站如何添加关键词xp花生壳做网站
  • 南宁霸屏网站开发国际数据公司idc
  • 百色建设网站广西建设监理协会网站
  • 天河营销型网站建设惠东网站设计
  • 网站建设用什么科目qq腾讯官网登录入口
  • 做网站硬件手表网站哪个最好知乎
  • 网站制作教程及流程网站优化常见的优化技术
  • 漯河网站建设-千弘网络品划网络做网站
  • 专业广州做网站公司简历网站免费
  • 广州h5网站制作公司营销网站的筛选
  • 国内最新新闻热点事件摘抄seo诊断书
  • 专业的免费网站建设哪家如何优化网站图片
  • 网站开发哪个更专业国家企业信用信息系统(全国)
  • 中小企业网站制作不了国外网站用什么dns
  • word网站的链接怎么做的网页设计大赛网站开发
  • dede网站模板 音响海外酒店 网站建设
  • 深圳 网站建设公司南宁网站忧化
  • 做油和米的网站山西省网站备案