netdata

压测中测量异步写入接口的延迟

ぐ巨炮叔叔 提交于 2020-02-27 02:29:30
在服务端性能优化的时候,有一种方案叫 “异步写入” 。就是把本来要写入数据库的功能放到异步来做,跟 异步查询转同步 的区别在于,异步查询是要等结果的,而异步写入则可以不等返回结果,甚至直接把写入任务丢到一个专门的任务队列中。 在对于实时性要求并不高的业务来讲,这是一个非常值得推荐的方法,比如用户消费了一笔金额场景中,对于用户消费信息的记录以及消费带来的积分提升、会员等级提升都可以异步来实现。日常接触最多的异步应该是日志和打点系统,几乎没有见过非异步实现的方案。 异步写入 带来的另外一个问题就是 “延迟” ,一般开发会给出一些延迟的参数值,但是在性能测试过程中这个值可能会非常大,甚至超出用户的可接受范围。这个时候就需要测试 延迟 在不用压力情况下的数值大小,以便给出最好的服务负载数据。 下面分享一个检测用户更改个人信息的接口的延迟测试方案: package com.okayqa.teacherpad import com.fun.utils.RString import com.okayqa.teacherpad.base.OkayBase import com.okayqa.teacherpad.function.UserInfo class T extends OkayBase { public static void main(String[] args) { def base

Java中interface属性和实例方法

耗尽温柔 提交于 2020-02-27 01:50:06
给定代码: interface Nameable { default void setName(String name) { this.name = name; } default String getName() { return this.name; } } class Employee implements Nameable { protected String name; } class HR { public static void main(String[] args) { Employee e = new Employee(); e.setName("John Doe"); System.out.println(e.getName()); } } 结果是什么?单选题。 A.接口Nameable无法编译。 B.类Employee无法编译。 C.类HR无法编译。 D.输出John Doe。 这段代码研究了default添加到Java 8 中的方法功能的各个方面。默认方法是在接口中通过实现定义的实例方法。尽管与在类中定义的常规实例方法相比,此类方法的继承方式有所不同,但是此功能仍然在Java中创建了多种实现继承的形式。 为了限制多重继承引起的问题,Java采取了两个步骤。第一个只是告诫您将功能用于特定和有限的目的,尤其是库接口的扩展

记一次失败的爬虫

一个人想着一个人 提交于 2020-02-26 09:36:37
收到一天振奋人心的假新闻,导致我去找了公开信息网站定点药店的信息,虽然结果比较失败,过程还是挺欢乐的,记录下来又可以水一篇文章了。以下是原文: 页面搜索功能有限,我就做了一个爬虫,思路分了两步,先找药店名称的编号,再查药店的具体地址。 这里面只有773条网点信息,我顺手做了个爬虫,代码粗糙,十几分钟完成的,效果还可以。代码分享如下: package com.fun import com.fun.frame.Save import com.fun.frame.httpclient.FanLibrary import com.fun.utils.Regex import com.fun.utils.WriteRead import net.sf.json.JSONObject import org.apache.http.client.methods.HttpGet import org.apache.http.client.methods.HttpPost class sd extends FanLibrary { static names = [] public static void main(String[] args) { test2(1) // 52.times { // test(it+1) // } // Save.saveStringList(names,

什么阻碍手动测试发挥价值

為{幸葍}努か 提交于 2019-12-30 10:32:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 互联网上的大多数产品都在通过网络进行交互,试图连接更多的用户释放更大的潜力。网络数据交互一直是软件测试人员的主要测试对象,因为它们在确保应用程序质量方面起着关键作用。虽然,最近自动化和机器学习在IT领域崭露头角,已经影响到了传统的软件测试领域。 如果我们提到手动测试。我们通常会低估手动测试的范围,因为假设自动化将接管所有的事情。这是一个很大的误解,自动化的目的是节省测试人员的时间来编写更好,更高效的测试脚本。手动测试依然会在业界盛行。 自动化测试和机器颇具潜力,给测试人员带来了很多机会。但是迄今为止,手动测试在测试软件方面的能力到底如何?进行软件测试时作为手动测试的弱点是什么?尽管比机器更富有经验和知识,为什么仍无法提供更好的质量保证? 无法提供足的用例场景 用户故事是随着敏捷Scrum的采用而流行的术语。用户故事基本上是让测试人员站在用户的立场上,并思考为什么他们的需求是怎么样的,他们会如何使用软件产品。 敏捷软件开发需要迅速反馈用户的需求,而与此同时,又急于在市场上尽快发布新的软件,留给测试工程师的时间越来越少,使得测试人员难以考虑周全,无法提供足够的测试用例来满足软件质量的要求。 执着于功能 测试人员专注于检查应用程序的基本功能,但往往忽略了最终呈现在用户面前的软件状态。

筛选自动化测试用例的技巧

大城市里の小女人 提交于 2019-12-27 10:11:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 与手动测试相比,软件测试自动化具有许多优势。它改善了结果和质量,提高了可靠性,并减少了结果偏差。此外,它还可以加快流程,增加覆盖率测试并最终提高软件的整体质量。良好的自动化可以提高交付质量,增加测试范围,降低测试成本,并在进行了正确测试后能够尽早发现错误。 测试自动化中的主要问题之一是选择要自动化的测试用例。但是,有人怎么知道所有测试用例将被自动化呢? 本文紧接上期: 自动化如何选择用例 内容,让我们看看其他一些有关如何选择要自动化的测试用例的技巧和规则。 重复测试 这是黄金法则。如果测试运行是重复的,则应使其自动化。这样可以节省您宝贵的时间和精力。另外,如果这是您假设将来会经常运行的测试,那么自动化是一个很好的办法。每次将更快获得更准确的结果。 高难度测试用例 如果一个测试用例人为执行过程中发生错误和被破坏的风险很大,或者手动测试很难完成,则应该优先使用自动化测试。如果涉及的风险很高,则应使该测试用例自动化。 主流程用例 自动化应用程序的主流程用例是一个非常不错的实践。避免人为错误的任何可能性,并且要安全、快速。对于可能危害整个项目的测试用例更应该优先进行自动化测试。 广泛的用例 需要进行大量数据和条件测试的场景更适合自动化测试。另外,在手动测试过程中犯错的机会可能会增多

拷贝HttpRequestBase对象

丶灬走出姿态 提交于 2019-12-26 10:16:30
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在实践 性能测试框架第二版 的过程中,我实现了一个单个HttpRequestBase对象的concurrent对象创建,单之前都是用使用唯一的HttpRequestBase对象进行多线程请求,目前来看是没有问题的,但为了防止以后出现意外BUG和统一concurrent的构造方法使用,故尝试拷贝了一个HttpRequestBase对象。原因是因为之前封装的深拷贝方法对于HttpRequestBase对象的实现类如:httpget和httppost并不适用,因为没有实现Serializable接口。所以单独写了一个HttpRequestBase对象的拷贝方法,供大家参考。 下面是 FunRequest 类的代码,深拷贝的静态方法在最后。 package com.fun.frame.httpclient import com.fun.base.bean.RequestInfo import com.fun.base.exception.RequestException import com.fun.config.HttpClientConstant import com.fun.config.RequestType import net.sf.json.JSONObject import org.apache

测试自动化的边缘DevTestOps

女生的网名这么多〃 提交于 2019-12-25 10:17:56
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> DevTestOps和DevSecOps是DevOps中测试自动化的必要组件。 随着软件开发人员和测试人员开始转向DevOps,软件开发的生命周期正在迅速发展。从一开始,组织就具有一个简单的开发和运营流程,但是现在用户要求每种产品都具有持续快速增强和改进的体验的能力。放多项目都已经拥抱DevOps,但是软件开发的多样性和不确定性使企业继续使用DevOps更具挑战性。 什么是DevOps DevOps使企业能够通过自动化基础架构、工作流和持续衡量应用程序的质量来改善开发人员和运营团队之间的协作和生产力。借助DevOps,开发人员可以分小块编写代码,以便可以尽快对其进行集成,测试,监视和部署,从而加快了开发过程。 DevOps集成使软件团队可以改善部署的发生率并减少新代码的部署时间。它提供了一种快速迭代方法,可以定期监控和改进软件产品。为了验证更新后的代码是否正常运行,需要进行连续测试。 在完成一个项目的测试之后需要进行连续测试,连续测试是网站或应用程序成功的关键因素之一。实际上,它被认为是自动化测试的最佳实践之一。另一方面,许多组织主要关注高级应用程序开发过程和DevOps实施以优化整体效率。 简而言之,连续测试有助于填补开发人员和测试人员之间的鸿沟。因此,当开发人员完成更新代码之类的工作时

2019年浏览器市场份额排行榜

与世无争的帅哥 提交于 2019-12-24 10:36:04
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 互联网上的每个网站都以独特的方式与每个浏览器进行通信。与其他浏览器相比,浏览器以单独的方式解释Web元素,并相应地呈现网站。 这意味着网站的外观不仅取决于前端开发团队,还取决于用于访问该网站的浏览器。 确保避免浏览器差异的做法称为跨浏览器测试,也称为浏览器兼容性测试。 大型企业和创业公司都必须确保您的网站为每个访问者提供一致的用户体验。测试团队的一时粗心大意可能最终使客户的乱七八糟。这就是为什么人们不能忽视执行跨浏览器测试的原因。但,执行浏览器兼容性测试说起来容易做起来难。 是否能够确认最重要的浏览器,这些浏览器是否可以覆盖所有的用户?还是大多数?可以忽略浏览器其他版本吗? 开始 一段时间以来,谷歌浏览器一直是全球使用最广泛的网络浏览器,但这并不意味着您可以对其竞争对手Mozilla Firefox视而不见,而Safari在不同设备上的发展趋势同样如此。Opera是非洲第二重要的浏览器,是亚洲的UC浏览器。研究和分析地理上和跨平台的各种重要Web浏览器和Web浏览器版本的市场份额,可以帮助制定应用程序的跨浏览器测试的策略。 全球Web浏览器的市场份额 根据从Statcounter获取的数据,在过去的12个月中,谷歌浏览器无疑拥有最高的市场份额,在全球范围内约占60%。其次是Safari(约占15%)

API测试基础

寵の児 提交于 2019-12-23 10:41:26
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在进行API测试之前,我们先了解一下 什么是API? API(全称Application Programming Interface)使两个单独的软件系统之间的通信和数据交换。实现API的软件系统包含可以由另一个软件系统执行的功能/子例程。 什么是API测试 API测试是一种用于验证API(应用程序编程接口)的软件测试类型。它与GUI测试非常不同,主要集中在软件体系结构的业务逻辑层。在API测试中,您无需使用标准的用户输入(键盘)和输出,而是使用软件将调用发送到API,获取输出并记下系统的响应。 API测试需要可以通过API进行交互的应用程序。为了测试API,您需要 使用测试工具调用API 编写自己的代码调用API API测试的测试用例: API测试的测试用例基于 基于输入条件的返回值:相对容易测试,因为可以定义输入并可以验证结果 不返回任何内容:没有返回值时,将检查系统上的API行为 触发其他一些API /事件/中断:如果API的输出触发了某些事件或中断,则应跟踪这些事件和中断侦听器 更新数据结构:更新数据结构将对系统产生某些结果或影响,应进行身份验证 修改某些资源:如果API调用修改了某些资源,则应通过访问相应资源来对其进行验证 API测试方法: 以下几点可帮助用户进行API测试:

从JVM堆内存分析验证深浅拷贝

最后都变了- 提交于 2019-12-20 12:11:53
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在重写性能测试框架的过程中,遇到一个问题,每个线程都要收集一些统计数据,但是在我之前的框架Demo里面有一种情况:单一的threadbase线程任务,多线程并发。我是直接使用的这个对象,如果每个线程threadbase包含统计信息的话,多线程执行一个任务肯定会出现不安全的情况,如果加锁又会导致“多线程”失去意义。故而采用了创建任务时将对象按照线程数拷贝一份,保证每个线程执行的threadbase对象都是独立绑定的。 顺便学习了一番Java深浅拷贝对象的知识,发现又学到了一点,关于深浅拷贝的原理和演示从代码级别来讲已经很多了,加之之前学到了Java堆内存相关的一些技巧,我决定使用内存分析来演示一下深浅拷贝。 关于概念性的问题,大家可以自行搜索,这里不便多说,直接开搞。 拷贝对象a分三种方式:1、直接创建另外一个对象a1=a;2、浅拷贝一个对象a2;3、深拷贝一个对象a3。 理论来家,1只会在堆内存有一个A对象实例,2会有两个A对象实例,3会有三个A对象实例。如果该对象还包含了对象B的话,那么1只会产生一个B实例,2也只会产生一个B实例,3会产生两个对象B实例。 到底是不是这样呢,实践是检验整理的唯一标准。 下面是我的测试代码: package com.fun; import com.fun.frame