posts - 35, comments - 0, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1. 引言
JUnit4提供的新断言语法具有很多优点且使用简单,这已经不再是新鲜事了,可发现在实际测试代码中仍未被普及应用,特发此文,以期更多的人能掌握运用。
2. assertThat基本语法
Hamcrest 是一个测试辅助工具,提供了一套通用的匹配符 Matcher,灵活使用这些匹配符定义的规则,程序员可以更加精确的表达自己的测试思想,指定所想设定的测试条件。
Junit4结合Hamcrest提供了新的断言语句-assertThat,只需一个assertThat语句,结合Hamcrest提供的匹配符,就可以表达全部的测试思想。
assertThat的基本语法如下:

assertThat(T actual, Matcher matcher)
assertThat(String reason, T actual, Matcher matcher)

actual 是接下来想要验证的值;
matcher是使用 Hamcrest 匹配符来表达的对前面变量所期望的值的声明,如果 actual值与 matcher 所表达的期望值相符,则断言成功,否则断言失败。
reason是自定义的断言失败时显示的信息。
一个简单的例子:
// 如果测试的字符串testedString包含子字符串"taobao"则断言成功
assertThat( testedString, containsString( "taobao" ) );

3. assertThat优点

  • 统一

只需一条assertThat语句即可替代旧有的其他语句(如 assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等),使断言变得简单、代码风格统一,增强测试代码的可读性和可维护性。

  • 语法直观易懂

assertThat 不再像 assertEquals 那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);)。相反,assertThat 使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读,符合人类思维习惯。

  • 错误信息更具描述性

旧的断言语法如果断言失败,默认不会有额外的提示信息,如
assertTrue(testedString.indexOf(“taobao”) > -1);
如果该断言失败,只会抛出无用的错误信息,如java.lang.AssertionError: ,除此之外不会有更多的提示信息。
新的断言语法会默认自动提供一些可读的描述信息,如
assertThat(testedString, containsString(“taobao”));
如果该断言失败,抛出的错误提示信息如下:
java.lang.AssertionError:
Expected: a string containing “taobao”
got: “taoba”

  • 跟Matcher匹配符联合使用更灵活强大

Matcher提供了功能丰富的匹配符,assertThat结合这些匹配符使用可更灵活更准确的表达测试思想。
// 验证字符串 s是否含有子字符串 "taobao" 或 "qa" 中间的一个
// 旧的断言,不直观,需要分析代码逻辑明白验证意图
assertTrue(s.indexOf("taobao")>-1||s.indexOf("qa")>-1);
// 新的断言,直观易懂,准确表达测试思想
assertThat(s,anyOf(containsString("taobao"),containsString("qa")));
// anyOf满足条件之一即成立,containsString包含字符串则成立

4. assertThat使用
要想发挥assetThat的威力,必须跟Hamcrest联合使用,JUnit4本身包含了一些自带了一些 Hamcrest 的匹配符 Matcher,但是只有有限的几个。因此建议你将Hamcrest包加入项目。
在pom里加入Hamcrest依赖。
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.1</version>
</dependency>

在测试类里导入包
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

通过例子学习是有效的学习方式之一,下面通过常用的示例演示如何使用assertThat,更详细的用法请参考Hamcrest相关文档。

  • 字符相关匹配符

/**equalTo匹配符断言被测的testedValue等于expectedValue,
* equalTo可以断言数值之间,字符串之间和对象之间是否相等,相当于Object的equals方法
*/
assertThat(testedValue, equalTo(expectedValue));

/**equalToIgnoringCase匹配符断言被测的字符串testedString
*在忽略大小写的情况下等于expectedString
*/
assertThat(testedString, equalToIgnoringCase(expectedString));

/**equalToIgnoringWhiteSpace匹配符断言被测的字符串testedString
*在忽略头尾的任意个空格的情况下等于expectedString,
*注意:字符串中的空格不能被忽略
*/
assertThat(testedString, equalToIgnoringWhiteSpace(expectedString);

/**containsString匹配符断言被测的字符串testedString包含子字符串subString**/
assertThat(testedString, containsString(subString) );

/**endsWith匹配符断言被测的字符串testedString以子字符串suffix结尾*/
assertThat(testedString, endsWith(suffix));

/**startsWith匹配符断言被测的字符串testedString以子字符串prefix开始*/
assertThat(testedString, startsWith(prefix));

  • 一般匹配符

/**nullValue()匹配符断言被测object的值为null*/
assertThat(object,nullValue());

/**notNullValue()匹配符断言被测object的值不为null*/
assertThat(object,notNullValue());

/**is匹配符断言被测的object等于后面给出匹配表达式*/
assertThat(testedString, is(equalTo(expectedValue)));

/**is匹配符简写应用之一,is(equalTo(x))的简写,断言testedValue等于expectedValue*/
assertThat(testedValue, is(expectedValue));

/**is匹配符简写应用之二,is(instanceOf(SomeClass.class))的简写,
*断言testedObject为Cheddar的实例
*/
assertThat(testedObject, is(Cheddar.class));

/**not匹配符和is匹配符正好相反,断言被测的object不等于后面给出的object*/
assertThat(testedString, not(expectedString));

/**allOf匹配符断言符合所有条件,相当于“与”(&&)*/
assertThat(testedNumber, allOf( greaterThan(8), lessThan(16) ) );

/**anyOf匹配符断言符合条件之一,相当于“或”(||)*/
assertThat(testedNumber, anyOf( greaterThan(16), lessThan(8) ) );

  • 数值相关匹配符

/**closeTo匹配符断言被测的浮点型数testedDouble在20.0¡À0.5范围之内*/
assertThat(testedDouble, closeTo( 20.0, 0.5 ));

/**greaterThan匹配符断言被测的数值testedNumber大于16.0*/
assertThat(testedNumber, greaterThan(16.0));

/** lessThan匹配符断言被测的数值testedNumber小于16.0*/
assertThat(testedNumber, lessThan (16.0));

/** greaterThanOrEqualTo匹配符断言被测的数值testedNumber大于等于16.0*/
assertThat(testedNumber, greaterThanOrEqualTo (16.0));

/** lessThanOrEqualTo匹配符断言被测的testedNumber小于等于16.0*/
assertThat(testedNumber, lessThanOrEqualTo (16.0));

  • 集合相关匹配符

/**hasEntry匹配符断言被测的Map对象mapObject含有一个键值为"key"对应元素值为"value"的Entry项*/
assertThat(mapObject, hasEntry("key", "value" ) );

/**hasItem匹配符表明被测的迭代对象iterableObject含有元素element项则测试通过*/
assertThat(iterableObject, hasItem (element));

/** hasKey匹配符断言被测的Map对象mapObject含有键值“key”*/
assertThat(mapObject, hasKey ("key"));

/** hasValue匹配符断言被测的Map对象mapObject含有元素值value*/
assertThat(mapObject, hasValue(value));

转载务必注明出处Taobao QA Team,原文地址:http://qa.taobao.com/?p=3541

posted @ 2012-01-17 17:09 timelyxyz 阅读(102) | 评论 (0)编辑 收藏

  conf目录包含了各种应用配置文件,有必须的文件:application.conf和routes。

  • application.conf:应用的主配置文件,包含了
  • routes:路由定义文件

  你也可以在application.conf中添加一些自己的应用中的特殊的配置选项,配置可以在程序中通过Play.configuration.get("propertyName")来读取。当你需要新建一个新的应用程序,可以使用play new命令来讲一些默认配置从$PLAY_HOME/resources/application-skel/conf这个目录中复制一些相关的程序启动的默认配置,还有一些配置选项是被注释的,皆是可以选择相关的项目来用。

  任何一个类库需要的配置文件,尽量将其放置到conf这个目录中:这个目录被配置在了Java的环境变量里了。

  当然,你也可以在application.conf这个文件中引用其他的一些play配置,只要用@include.作为开头即可。例如,你定义了一个附加的MIME类型在conf/mime-types.conf里:

# Web fonts
mimetype.eot = application/vnd.ms-fontobject
mimetype.otf = application/octet-stream
mimetype.ttf = application/octet-stream
mimetype.woff = application/x-font-woff

  你可以通过如下命令讲文件导入到application.conf中:

@include.mime = mime-types.conf

 

文献参考:http://www.playframework.org/documentation/1.2.3/main

posted @ 2012-01-16 15:43 timelyxyz 阅读(107) | 评论 (0)编辑 收藏

  • 数据源概念
  • 数据库连接池 
  • jndi概念
  • 数据源与连接池关系
  • 数据源与jndi关系
  • jdbc基础

1.什么是数据源?

答: 数据源定义的是连接到实际数据库的一条路径而已,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接的,如odbc数据源。也就是 说数据源仅仅是数据库的连接名称,一个数据库可以有多个数据源连 接。                                                                                                                              

       在Java语言中,DataSource对象就是一个代表数据源实体的对象。一个数据源就是一个用来存储数据的工具,它可以是复杂的大型企业级数据库,也可以是简单得只有行和列的文件。数据源可以位于在服务器端,也可以位于客服端。

2.什么是数据库连接池?

答: 数据库连接是负责分配、管理和释放数据库连接。使用数据库连接池是因为数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤 为突出。如weblogic、tomcat、WebSphere容器都实现了数据库连接池,但是数据库连接池是可以独立出来自己编码实现的。

        数据库连接池在系统启动时初始化了一定量maxIdle=idlenum的数据库连接,即没有他的使用中的链接被释放的情况下,连接池中保存的最大空闲链 接数。数据库连接请求如果没有超过idle的值则直接去连接池中获取;如果超过了maxIdle的值则新建一个数据库连接;但如果数据库连接池中的连接总 数超过了maxActive=activenum则 (如下处理);

    
  1   直接抛错  
  2   让想要借出连接的线程等待一段时间,如果等不到,再抛错  
  3   每隔一段检查一次pool,直到有可用连接,否则一直等下去  
  4   永远可以拿到(视情况需要maxActive不设置或0或负)  

但当没有可以使用的数据库链接的时候,连接池将要等待一个链接被返回的最长时间(毫秒)maxWait=waitnum,超过这个时间就要抛出异常。

3.什么是jndi?

答:jndi全称是java naming and directory interface。简单点就是你按命名规则给一个东西命名然后你就可以通过该名字在特定环境下直接查找到该东西了。

JNDI 是用于向Java程序提供目录和命名功能的API。可以简单地把JNDI理解为一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和惟一的 名字绑定。外部程序可以通过名字来获取对某个对象的引用。在一个文件系统中,文件名被绑定给文件。在DNS中,一个IP地址绑定一个URL。在目录服务 中,一个对象名被绑定给一个对象实体。

在Intranets(企业内部网)和Internates(互联网)中 目录服务(Directory service)都非常重要,它规范了命名规则,让人们容易理解实体及之间的关系。JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名 空间的概念。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。

jndi被设计成独立于特定的目录服务,所以各种各样的目录都可以通过相同的方式进行访问。这样使用jndi的java程序员不仅可以获得统一规整的命名和目录,而且可以通过多层的命名方案无缝访问(seamless acess)目录对象。

4.数据源与数据库连接池关系?

答: 我们通过第三方工具来使用数据源来实现对数据库数据操作。一个数据库连接池可以给它创建多个数据源,如一个人有别名;如果单纯使用jdbc连接数据库是 web容器你要什么就去连什么。这样做没人看不耗内存,量大了你就死机。可以这样理解,数据源表示一个与数据库的连接(传统)或者表示很多与数据库的连接 (使用数据库连接池)。数据源是用于访问连接池或多池的JNDI对象,多池的主要目的是提高可用性和在一组连接池间实现负载均衡。

5.数据源与jndi关系?

答:数据源是在JDBC 2.0中引入的一个概念。 在JDBC 2.0扩展包中定义了javax.sql.DataSource接口来描述这个概念。如果用户希望建立一个数据库连接,通过查询在JNDI服务中的数据 源,可以从数据源中获取相应的数据库连接。这样用户就只需要提供一个逻辑名称(Logic Name),而不是数据库登录的具体细节。即DataSource采用Java的JNDI技术,来获得DataSource对象的引用。当然各种web容 器把DataSource作为一种可以配置的JNDI资源来处理如tomcat。生成DataSource对象的工厂为 org.apache.commons.dbcp.BasicDataSourceFactory。

6.jdbc基础

答:java database connectivity standard 是一套规范的面向应用程序的接口,通过它可以访问各类关系数据库。各个数据库会实现该接口作为驱动如jtds.jar,当然可以自己写实现。

jdbc 是低级api,提供访问数据库的接口,是构建高级api的基础,利用纯java编写可以在任何操作系统任何java环境下工作。JDBC API 中定义了一些Java类分别用来表示与数据库的连接(connections), SQL语句(SQL statements), 结果集(result sets)以及其它的数据库对象, 使得Java程序能方便地与数据库交互并处理所得的结果。

使用JDBC, 所有Java程序(包括Java applications , applets和servlet)都能通过SQL语句或存储在数据库中的过程(stored procedures)来存取数据库。要通过JDBC来存取某一特定的数据库,必须有相应的JDBC driver,它往往是由生产数据库的厂家提供,是连接JDBC API与具体数据库之间的桥梁。JDBC driver 是用于特定数据库的一套实施了JDBC接口的类集。

简单的说,jdbc可以做三件事:与数据库建立连接,发送sql语句,处理结果。jdbc可以理解为odbc的纯java语言和面向对象的实现。

7.数据库访问方法?

答:在ASP中可以通过三种方式访问数据库:
1、IDC(Internet Database Connector)方式;
2、ADO(ActiveX Data Objects)方式;
3、RDS(Remote Data Service)方式。
        在jsp中访问数据库常用:
1、JDBC-ODBC桥接器;
2、特定数据库的jdbc驱动直接连接数据库;
3、经过池化维护一定量的连接数目,用jndi去访问数据源对应池获取连接;

 

参考:http://www.diybl.com/course/7_databases/database_other/2008126/97740.html

posted @ 2012-01-16 09:19 timelyxyz 阅读(134) | 评论 (0)编辑 收藏

1. 控制输出时间
<div>
    <p>this part is cached for 10 seconds. Note the timeout spec with invoke overrides CacheFor annotation. </p>
    `a controllers.more.Portlets.panel2(b), "10s"
</div>
<p>内文字显示十秒钟然后进入panel2action

2.log:log directives are used to print a line of information to the console. It can take an argument of String
`log
`log a + i
`log "a message "
log命令用来在控制台输出一行信息,后面可以添加参数,输出结果如下:
japidviews/templates/log.html(line 5):
japidviews/templates/log.html(line 14): a10
japidviews/templates/log.html(line 18): a message

3.stopwatch m 输出render到模板所需的时间

4.~i  直接输出i的值

5.`each posts | String p 与`for String p : posts等价,
`for String p : posts
    <p>index: $_index, parity: $_parity, is odd? $_isOdd, is first? $_isFirst, is last? $_isLast, total size: $_size </p>
    call a tag:  `tag SampleTag p
`
输出index: 6, parity: even, is odd? false, is first? false, is last? true, total size: 6
另一种格式
`for (final Post p : posts) {
    another notation for invoking actions:  
    `invoke Application.echoPost(p)
`}

6.if-else循环语法:
    `if expr            `if(asBoolean(expr)){
        xxx                xxx    
    `else if expr        `} else if(asBoolean(expr)){
        yyy                yyy
    `else            `} else {
        zzz                zzz
    `            `

7.` suppressNull on如果下面出现了null的意外,如
` a = null;
safe to do a.something too: $a.length()
输出safe to do a.something too:

8.dontRedirect();控制不跳转页面,即停留在原页面。

说明:

∵在play运行时,调用一个action必须出发一个Http重定向

∴如果不想重定向,必须调用JapidController.dontRedirect()来避免

9.${a}, ~a, $a and ${escape(a)} and ~{a}这几种表达式的值相等

10.页面读取异常
    `for (Error e: errors()){
        <p>$e.getKey() : $e</p>
    `}

11.“Elvis操作符”是Java三目运算符的简写。一个便捷的用法是,如果表达式的值为false或者null,则返回一个合乎情理的默认值。好吧,我所实现的Elvis操作符确实不像Java中的一样:)我所添加的?:组合符号只在${}标签内起作用。
name ?: “empty”

12.`doBody m:带着参数回到原先界面。该命令中的参数列表必须与调用处的“|”之后的参数声明匹配,doBody通过匹配的参数传递到模板。

13.join(Strings, "|"):Strings是list,该方法为list中的每个元素见添加一个“|”,形成一个字符串。

14.`invoke与`a触发的action返回的结果直接插入到原先界面中,作为界面参数的一部分。注意:invoke出发的action不跳转页面。

15.renderJapid(Object... Objects):带着参数跳转到原先界面

16.renderJapidWith(String template, Object... args):带着参数跳转到指定模板,可以实现在一个action中渲染多种模板。

posted @ 2012-01-14 15:40 timelyxyz 阅读(298) | 评论 (0)编辑 收藏

junit4使用时导入的主要包org.junit.Assert.*;

1. setUp与tearDown:这两个方法是junit framework中提供初始化和反初始化每个测试方法的。
setUp是在每个测试方法调用前被调用,负责初始化测试方法所需要的测试环境;
tearDown是在每个测试方法被调用后被调用,负责撤销测试环境。
基本测试步骤如下:
测试开始 -> setUp -> testXXX -> tearDown -> 测试结束

2. public static void fail(java.lang.String message)输出错误信息

3.TestSuite 组装测试。可以讲所有的TestCase的调用添加到TestSuite中,同样,也可以添加另外的TestSuite到TestSuite中。

4.静态导入:就是在import关键字后面加上static,然后可以调用这个类中的方法就和调用自己的方法没有什么区别,例如assertEqual(excepted, actual),这个函数可以直接调
用,不需要加上类名或者实例对象等。

5.@Test(arg ...)被该annotation修士的方法,在JUint终将会被自动执行,该annotation只能修饰public void 方法。

6.@Test参数timeout:规定该方法执行的时间,如果设置参数,则被修饰方法必须在该事件被执行结束,否则会抛出异常。语法:@Test(timeout=1)// 时间的单位为毫秒

7.@Test参数expected:规定该方法排除异常,如果设置该参数,责备修饰方法在排除该参数规定的异常的情况下才可能通过测试,否则测试失败。for example
@Test(expected=ArithmeticException.class)
public void testExceptedF(){
    int i = 1/0;
}
此时,testExceptionF抛出了ArithmeticException异常,所以测试通过;如果测试失败,Failure Trace面板中会列出错误轨迹。

8.@After:被该annotation修饰的方法,将会在每个测试方法执行之后执行一次。该annotation只能修饰public void 方法。

9.@Before:被该annotation修饰的方法,将会在每个测试方法执行之前执行一次。该annotation只能修饰public void 方法。

10.@AfterClass:被该annotation修饰的方法,将会在所有测试方法执行结束后执行一次。该annotation只能修饰public static void 方法。

11.@BeforeClass:被该annotation修饰的方法,将会在所有测试方法执行前执行一次。该annotation只能修饰public static void 方法。

posted @ 2012-01-14 14:53 timelyxyz 阅读(99) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4