「java系统测评」java 测试
今天给各位分享java系统测评的知识,其中也会对java 测试进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、有没有技术大牛了解java开发,测试和CI的关
 - 2、JAVA可运用于哪些方面 强的后台 测试,运维会用到?
 - 3、在java中如何测试系统默认的实数的类型是float还是double?(用程序说明,谢谢)
 - 4、软件测试和java有什么区别?
 - 5、北大青鸟java培训:Java初期学者程序性能容易的问题测试?
 
有没有技术大牛了解java开发,测试和CI的关
大家可能对如下情景比较熟悉:
如果开发过SSH的web项目,启动服务器可能会比较慢,有的项目甚至需要1分多钟,甚至更多,这个启动时间的等待一般就浪费了;
在开发项目时,有些功能比较复杂,当时觉得思路特清晰,但是过了一段时间后,自己也忘了,完善功能时频繁出现bug,降低开发速度;
在维护项目时,不知道自己修改的对还是不对,是否存在隐患;维护速度降下来了;
如果开发一个很多人都使用的接口,典型的如用户系统,要保证比如升级时向下兼容;
在团队间协作时,有时候只定义好接口,对方还没有给实现,如何进行同步开发?
如上问题,估计只要是个开发人员,都可能遇到过;如果此时有了单元/集成测试,那我们能很好的解决这些问题。(注:加下来如果没有特殊情况,不刻意强调 单元测试/集成测试,即提到测试是指的是单元/集成测试)
我从以下几个方面介绍测试:
1、为什么需要测试?
2、如何进行测试?
3、测试有哪些好处?
4、一切都需要测试吗?
1、为什么需要测试?
测试的目的是什么?我的理解是:
缩短发现问题到解决问题的速度;
给程序一个修改后能验证是否正确的保证;(回归测试)
如果是开源软件,我们可以通过单元测试了解其是怎么使用的;比如我之前通过cglib的单元测试学习过cglib的使用;
所以如果你遇到如上问题,就需要写测试。写测试可能是为了自己(1、2);也可能是为了帮助别人(3)。
2、如何进行测试?
很多朋友不知道如何进行测试,其实测试很简单,别把它想复杂了,按照自己的想法测试每个功能点是否正确即可。
2.1、测试流程
单元测试流程
集成测试流程
集成测试流程
可以看出,单元测试与集成测试唯一不同点是一个调用依赖系统而一个不调用;因为单元测试是最小粒度的测试,如在Java中是测试一个类,不会测试依赖系统;而集成测试是会测试依赖系统的。
测试的步骤:
准备环境
调用被测系统
验证
清理环境
环境:也叫做夹具(fixture)或者固件,表示调用被测系统时需要准备/清理的数据等等;
被测系统:在Java中就是要测试的类,如UserService;
依赖系统:测试被测系统时,其依赖的部分,如UserDao;
测试用例:包含测试方法的类,里边有很多测试方法来测试被测系统。
接下来仔细看看各部分都做了哪些工作。
2.2、环境
环境,也叫做夹具(fixture),表示调用被测系统时需要准备/清理的数据等等;保证测试时环境是干净的,如不被之前的数据库数据影响;保证每次测试都是在干净/新鲜的环境中执行的。所谓干净的环境表示如当前测试不被之前测试插入/删除/修改的数据造成影响。在junit中可以使用:
@Before(setUp) 安装夹具或准备环境:在测试用例的每个测试方法之前执行;比如创建新鲜的被测系统,单元测试时安装Mock的依赖系统;
@After(tearDown)卸载夹具或清理环境:在测试用例的每个测试方法之后执行;比如数据库测试时回滚事务,删除数据;关闭文件;
@BeforeClass:在整个测试用例之前执行;
@AfterClass:在整个测试用例之后执行;
使用如上方法,而不是直接在测试方法中安装/卸载;是因为不管有没有异常,@After/@AfterClass都会执行,这样防止出现异常可能造成环境是不新鲜的问题。
如果大家使用spring test来测试数据库相关的系统,可以考虑使用@TransactionConfiguration来支持默认事务回滚,这样不会对现有系统造成影响。具体可参考《【第十三章】 测试 之 13.1 概述 13.2 单元测试 ——跟我学spring3》和《【第十三章】 测试 之 13.3 集成测试 ——跟我学spring3》
测试时一定要保证环境是干净/新鲜的,才能保证每次测试的结果是一样的。
2.3、被测系统与依赖系统
被测系统:在Java中就是被测试的Java类。
依赖系统:就是被测试Java类依赖的其他类。
如果是单元测试,一般情况下,会对依赖系统进行模拟(Mock),即给它一个假的实现;典型的如测试服务层时注入一个Mock的DAO层,这样的好处:
加快测试速度;因为不会调用真实的被测系统,所以速度特别快;
测试还没有完成的功能;尤其在多团队协作时,可以只在定义好接口的情况下开发系统;
如果是集成测试时,直接注入真实的依赖系统即可,好处:
完成联调;
发现自己的问题;
还可能发现自己使用上问题及使用的API的问题;
单元测试虽然好,但是是隔离测试,即不会调用被测系统来完成测试,因为不是真实的联调,所以很可能会潜在有一些问题,因此还是需要集成测试。(所以不是很刻意分单元或集成测试,且有些系统可能只有集成测试)
但是集成测试速度是比较慢的,一般提交给CI执行,不影响当前开发进度。
2.4、验证
验证的目的:是保证实际结果和我们预期的结果是否一致,说白了就是是否是我们想的那样。
一般使用断言来验证,如:
Assert.assertEquals(expectedResult, actualResult); //验证预期结果和实际结果是否相等
验证主要有两种:
结果验证
行为验证
结果验证:即验证被测系统返回的结果是否正确,如:
Java代码
@Test
public void testCount() {
String ql = "select count(o) from User o";
long expectedCount = repositoryHelper.count(ql) + 1;
User user = createUser();
repositoryHelper.getEntityManager().persist(user);
long acutalCount = repositoryHelper.count(ql);
Assert.assertEquals(expectedCount, acutalCount);
}
验证返回的数据总数 = 插入之前的总数 + 1; 即结果验证。此处我们使用了一种叫做相对(delta)测试;即不关心数据库里到底多少条,只关心实际的和预期的差。
行为验证:即验证被测系统是否调用了依赖系统的某个API ,这个只有当我们使用Mock时测试时比较简单,如当用户注册时:
1、加积分
2、发系统消息
3、……
此时我们并不能通过结果验证是否调用了这些方法;那么我们可以使用Mock技术来完成验证是否调用了这些API,比如使用jmock测试框架就支持行为验证。集成测试是很难进行行为验证的,如果测试需要预留间谍接口。
3、测试有哪些好处?
我们写代码的目的是正确的完成某个功能,如何保证正确呢?测试!所以在不使用如单元测试技术时,我们也是需要测试,但是这个测试是我们人工验证的。缺点很明显:
不是自动的,每次需要对比预期结果与实际结果,尤其数据量/逻辑复杂时更痛苦;
不是回归的,上次测试完成后,下次还得重复自己一遍;
为了解决这个问题,我们使用如单元测试技术来解决这个问题:
测试自动化;即验证预期结果与实际结果交给计算机吧;
测试回归性,可以重复执行测试,验证修改后逻辑是否还是正确的;
即测试的好处,从如上已经提炼出来了:
缩短发现问题到解决问题的时间;
重复使用测试,保证修改后的代码还是正确的;
如果做开源项目,可以提供给使用人员参考如何使用;
因为单元测试都非常快,所以提升了开发速度;
4、一切都需要测试吗?
肯定不是,一切都是相对的;哪些不需要测试呢:
你非常熟悉的功能;
一些简单的CRUD;
你认为不需要测试的;比如你很有把握的东西,就没有必要浪费时间测试了;
哪些需要测试呢:
复杂的业务逻辑/系统核心功能,最典型的如订单系统:一定要有足够的单元测试保证,这是一个电商系统的核心;还有如用户系统、积分系统等等;
框架级别/工具级别/通用级别的代码需要测试,即提供给第三方使用的代码,因为这些代码可能被很多系统依赖,应该保证其正确性;而且还要保证以后版本升级的向下兼容;
你认为需要测试的,比如你没有把握的东西,还是写点测试来缩短如开发web项目的重启系统的时间吧;
测试不是不耗时间的,没意义的测试就是浪费时间,最典型是一些书上的对一个增删改查进行测试,实际项目没有任何意义。所以你应该只对自己很难驾驭的觉得有必要的代码进行测试。不要成为一个测试狂,什么都测试。
一些测试可以参考我的《es——JavaEE快速开发脚手架》中的代码。通过测试我得到了许多好处。
到此我们介绍完成了测试,但是如果我们使用了如集成测试时,测试执行起来可能比较慢,跑一遍测试可能需要5分钟,那怎么办呢?
每天下班前跑一遍集成测试,然后修复,下班走人;
CI:持续集成,交给持续集成服务器,自动地测试完成后把测试报告以邮件的形式发到开发人员邮箱;
------------------------------------分割线----------------------------------
接下来介绍一下CI吧。
1、为什么需要CI
2、CI如何工作的
3、travis-ci介绍
1、为什么需要CI
正如前边说的,我们单独测试可能会遇到如下问题:
如果写了一个测试,就要把所有测试跑一遍看看整个系统是否是正确的,那么每次等待时间是非常漫长的;
如果团队中的其他成员改了功能并提交了,如何快速得到该次提交对当前系统代码是正确还是失败的反馈;
那怎么办呢?自动化地持续集成(CI)!CI的核心就是干这件事情的。自动化持续地集成测试。
使用CI后,如果使用Maven,可以新建多个profile:
本地测试时忽略一些比较慢的测试;
CI服务器上执行所有测试;
2、CI如何工作的
一个典型的持续集成流程:
定期检测版本服务器上是否有代码更新;
如果发现代码更新,从版本服务器下载最新的代码;
自动构建并自动化的测试;
不管错误/失败,生成报告给开发人员;
有些CI服务器还能产生可执行的软件,自动化地部署到测试机器,交给测试人员测试。
如图所示:
持续集成服务器其实就是一个定时器,自动帮你下载最新代码、编译、测试、集成及产生报告发给开发人员。
常见的CI服务器有:
Apache Continuum
Hudson
CruiseControl
Jenkins CI
TeamCity
Travis CI
我09年时使用过TeamCity社区版,足够满足常见需求;目前我使用github托管项目,使用Travis CI进行分布式的持续集成,免费,目前看来还是不错的。
3、travis-ci介绍
我现在开发的ES-JavaEE项目开发脚手架就是使用travis ci进行持续集成;具体参考《Getting started》进行与Github集成,其支持的语言:
C
C++
Clojure
Erlang
Go
Groovy
Haskell
Java
JavaScript (with Node.js)
Objective-C
Perl
PHP
Python
Ruby
Scala
支持的数据库:
MySQL
PostgreSQL
MongoDB
CouchDB
Redis
Riak
RabbitMQ
Memcached
Cassandra
Neo4J
ElasticSearch
Kestrel
SQLite3
更多请参考其官网的介绍。
如果是Java开发人员,支持的JDK包括:OpenJDK 和 OracleJDK。 如果使用的是OpenJDK,Maven中使用ascii2native插件时,需要如下配置:
Java代码
plugin
groupIdorg.codehaus.mojo/groupId
artifactIdnative2ascii-maven-plugin/artifactId
version1.0-alpha-1/version
executions
execution
phasegenerate-resources/phase
goals
goalnative2ascii/goal
/goals
configuration
encodingUTF-8/encoding
srcsrc/main/messages/src
desttarget/${project.artifactId}/WEB-INF/classes/dest
includesmessages.properties/includes
/configuration
/execution
/executions
!-- native2ascii 使用的tools.jar --
dependencies
dependency
groupIdcom.sun/groupId
artifactIdtools/artifactId
version1.7.0/version
scopesystem/scope
systemPath${java.home}/../lib/tools.jar/systemPath
/dependency
/dependencies
/plugin
如果使用mysql,端口只能是3306。
如果想开端口测试,这是不允许的。
如下是我项目中的一个配置.travis.yml,放到项目的根下即可:
-----------------------------------
language: java 语言
env: 环境
- DB=mysql 使用mysql
jdk:
- openjdk jdk使用openjdk
mysql:
database: es 数据库名为es
username: root 用户名为root
password : 密码为空
encoding: utf8 编码为utf8
install: 安装时执行的脚本
- mvn install -Dmaven.test.skip=true mvn安装并跳过测试
before_script: script之前执行的测试
- cd web
- mvn db:create 创建数据库的mvn命令(此处使用了 maven-db-plugin 插件)
- mvn db:schema 创建脚本的mvn命令
- mvn db:data 安装数据的mvn命令
- cd ..
script: 测试时执行的脚步
- cd common
- mvn test 测试common子模块
- cd ..
- cd web
- mvn test -Pit 测试web子模块,并指定使用it profile测试(即集成测试的配置,具体参考pom.xml中的profile/it)
notifications: 触发
email: 测试完成后测试报告发到哪
- zhangkaitao0503@gmail.com
-----------------------------------
持续集成不能修复代码的错误,而是和单元测试一样,缩短发现问题带解决问题的时间,这样可以提高开发效率,降低项目风险,提高项目的稳定性。而且尤其是团队协作时,可以发现其他人的代码是否对自己的代码产生影响。
到此我们利用单元测试+CI可以加速开发人员的开发速度。利用好单元测试和CI,不要纯粹为了单元测试和CI而去做这些事情。
本文没有介绍TDD,TDD并不会那么美好,我认为我们可以借鉴TDD的一些思想,但决不能迷信TDD,有时候,尤其如开发企业应用,先写功能再写测试可能效率更高,而且大部分时候是不需要TDD的。而且我也没能在实际项目中获取太多TDD的好处,但是我获得了测试的好处。
本文也没有介绍测试覆盖率,我认为不要一味的追求覆盖率,有时候有的覆盖率没有任何意义。所以不要让为了覆盖率而覆盖率拖慢了项目开发进度。
正如stackoverflow上的一篇帖子《How deep are your unit tests?》上Kent Beck的回答:
写道
老板为我的代码付报酬,而不是测试,所以,我对此的价值观是——测试越少越好,少到你对你的代码质量达到了某种自信。
可以前往coolshell的“单元测试要做多细?”去得到一些经验。
JAVA可运用于哪些方面 强的后台 测试,运维会用到?
其实现实生活中有很多地方应用到了Java,从电子商务网站到Android应用,从科学应用到金融应用比如电子交易系统,从游戏(Minecraft)到桌面应用好比Eclipse,NetBeans以及IntelliJ,从开源的文档到J2ME应用。下面来详细的介绍这些。
1、安卓应用
如果你想弄清楚Java用在什么地方,你离这个目标不是太远。打开你的安卓手机和任何一款App,它们是使用Java语言,基于GoogleAPI(和JDK类似)开发的。数年的安卓支持已经有了很大的提高,并且很多Java程序员已经成为了安卓App开发者。安卓使用不同的Java虚拟机、不同的包,但是代码仍是用Java写的。
2、金融业服务器的应用
在金融服务中Java有很重要的作用。很多银行像建行、中行等很多银行使用Java来开发前台和后台电子交易系统,提供解决方案和确认系统以及数据处理项目等等。
Java大多数用在开发服务器端的应用,几乎不用来开发前端,前端是从一个服务器接收数据,然后处理它并把它发送给其他进程。
3、Java Web应用
Java在电子商务和Web应用领域也是有很多的应用。现在有很多使用Spring MVC、Structs2.0和类似框架开发的RESTful风格的服务。甚至建一个简单的依赖Servlet、JSP和Structs开发的Web应用在各种各样的政府项目中很受欢迎。政府的很多部门如卫生局、保险部门、国防部等部门都有他们使用Java开发的Web应用。
4、软件工具
很多有用的软件和开发工具是用Java开发的,例如Eclipse、interllij、Netbeans IDE。我认为大多数使用的桌面应用也是用Java开发的。所以有一段时间,Swing在开发客户端方面非常流行,尤其是在金融行业和投资银行。现在,Java FX正在逐渐受到欢迎,但是仍不能成为Swing的替代品,而C#在金融领域内已经几乎代替了Swing。
5、交易应用
第三方用用交易应用,作为更大的金融服务业的一部分也是用Java开发。
流行的交易应用像Murex也是用Java开发的,很多银行都使用它们来连接前后端。
6、J2ME应用
虽然iOS和Android的出现几乎抹杀了J2ME的三星手机方面还是有很大的市场,但是在低端Nokia和使用J2ME的三星手机方面还是有很大的市场。有一段时间,安卓上可用的游戏、软件几乎全部是用MIDP、CLDC,他们是J2ME平台的一部分。J2ME在一些产品如蓝光光碟、机顶盒等等。
WhatsApp很瘦欢迎的一个原因是因为对所有Nokia手机的J2ME平台来说是可用的。
7、嵌入式领域
在嵌入式领域,Java也是有很大应用的。他展示了平台是多么的强大,你仅需130kb就能使用Java技术(在智能卡或者传感器上)。起初,Java是为嵌入式设备而设计的。实际上,这是Java最初“一次编写,到处运行”初衷的一个部分,现在看来获得了成功。
8、大数据技术
Hadoop和其他大数据技术以这样的或那样的方式使用者Java,例如Apache依赖Java的HBse和Accumulo(开源)以及ElasticSearch。但是Java在该领域并不占统治地位,因为有其他技术如MongoDB是用C++开发的。
如果Hadoop或者ElasticSearch发展壮大的话,Java在这个发展的领域有可能获得主要的占有率。
9、高频率的交易领域
Java平台在现在JIT技术的帮助下,他的性能特性已经有了很大的提升,传送性能已经到了C++水平。由于这个原因,Java在开发高性能系统方面还是很受欢迎的,性能与机器语言相比稍差一些,但是你可以安全的折中--轻便。可维护带来更快的速度。对一个缺乏经验的C++程序员来说,只能使应用变得更慢和不可靠。
10、科学应用
现在,对于科学应用来说Java经常作为一个默认的选择,包括自然语言处理。这种现象的主要原因是Java更安全、轻便、已维护,并且与C++和其他语言相比有更好的高级并发工具。
在java中如何测试系统默认的实数的类型是float还是double?(用程序说明,谢谢)
public class Demo
{
public static void main(String[] args)
{
//整数默认类型为int
byte a=1;//数据类型为byte
byte b=1;//数据类型为byte
byte c=a+b;//两个btye类型的数据相加会转为int类型。
short d=a+b;//同理(因为会默认转为int型所以会这里会报错)
int s=1;
int m=a+s;//默认为int型,不会报错
float n=1;
s=n+s;//默认向下转型为int型,这里大的数据类型转小的,double型与int型相加同理
int e=a+b;
float f= a+b;
double g=a+b;
//小数默认类型为double
double h=1;
float i=1;
float j=h+i;//默认结果转为double类型,所以这里会报错
}
}
软件测试和java有什么区别?
java是开发,做软件的;软件测试是对开发人员做完的软件进行测试的,限于黑盒测试哈,另外还有白盒测试了,就比较难了,白盒测试是用自己编写的测试代码来检测、测试开发人员编写的代码的安全性、完整性等等
北大青鸟java培训:Java初期学者程序性能容易的问题测试?
1、介绍在开发中,性能测试是设计初期容易忽略的问题,开发人员会为了解决一个问题而“不择手段”,所参与的项目中也遇到了类似问题,字符串拼接、大量的调用和数据库访问等等都对系统的性能产生了影响,可是大家不会关心这些问题,“CPU速度在变快”,“内存在变大”,并且,“好像也没有那么慢吧”。
有很多商业的性能测试软件可供使用,如Jprofiler、JProbeProfiler等,但在开发当中显得有些遥远而又昂贵。
2、目标本文将讲述如何利用语言本身提供的方法在开发中进行性能测试,找到系统瓶颈,进而改进设计;并且在尽量不修改测试对象的情况下进行测试。
3、预备知识面向对象编程通过抽象继承采用模块化的来求解问题域,但是模块化不能很好的解决所有问题。
有时,这些问题可能在多个模块中都出现,像日志功能,为了记录每个方法进入和离开时的信息,你不得不在每个方法里添加log("insomemethod")等信息。
如何解决这类问题呢?将这些解决问题的功能点散落在多个模块中会使冗余增大,并且当很多个功能点出现在一个模块中时,代码变的很难维护。
因此,AOP(AspectOrientedProgramming)应运而生。
如果说OO(AobjectOrientedProgramming)关注的是一个类的垂直结构,那么AOP是从水平角度来看待问题。
动态代理类可以在运行时实现若干接口,每一个动态代理类都有一个Invocationhandler对象与之对应,这个对象实现了InvocationHandler接口,通过动态代理的接口对动态代理对象的方法调用会转而调用Invocationhandler对象的invoke方法,通过动态代理实例、方法对象和参数对象可以执行调用并返回结果。
说到AOP,大家首先会想到的是日志记录、权限和事务,是的,AOP是解决这些问题的好办法。
性能测试主要包括以下几个方面:计算性能:可能是人们首先关心的,北大青鸟认为简单的说就是执行一段代码所用的时间内存消耗:程序运行所占用的内存大小启动时间:从你启动程序到程序正常运行的时间可伸缩性(scalability)用户察觉性能(perceivedperformance):不是程序实际运行有多快,而是用户感觉程序运行有多快.
java系统测评的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java 测试、java系统测评的信息别忘了在本站进行查找喔。