申艳超-博客

搜索引擎、分布式、高性能、NLP、ElasticSearch、Solr

0%

什么是Sonar?

Sonar是一个开源的代码质量管理平台。它能对代码进行如下7个维度的管理。

sonar
使用插件,它可以对20多种语言进行代码质量管理,这其中包括Java,C#,C/C++,PL/SQL等等。

安装Sonar

1.下载sonar,地址http://www.sonarqube.org/downloads/。通常选取稳定版本下载即可,这是一个zip文件。
2.解压下载的sonar到一个目录。我们称这个解压后的路径为SONAR_HOME
3.进入$SONAR_HOME/bin/${os-version}/,找到sonar.sh,执行./sonar.sh console即可。在windows下是StartSonar.bat。
4.现在进入http://localhost:9000,就看到了界面。默认的登录使用admin:admin

这个时候,Sonar已经运行啦。但是在生产环境是不行的。上面跑起来的只是一个样例,使用的是h2内存数据库。我们可不想重启服务后,生产环境的数据都没了。

Read more »

refactor_to_pattern

GoF的《设计模式》以及Martin Fowler的《重构》都是经典。而《重构与模式》则是将二者结合起来。通过设计模式来指导重构,而重构的目的就是让代码更加的简单,易于维护和扩展。

写作缘由

  • 过度设计:代码存在设计过度的情况
  • 模式万灵丹:认为设计模式的万能的
  • 设计不足:类比与过度设计,长期设计不足,导致开发节奏“快、慢、更慢”
  • 测试驱动开发和持续重构:敏捷开发中,Kent Beck说开发过程是“红-绿-重构”
  • 重构与模式:模式有助于改进设计,通过重构实现模式或者趋向模式进行重构
  • 演进式设计:将模式放到重构的背景中进行领会

什么是重构

定义:重构是一种对软件内部结构的改善,目的是在不改变软件的可见行为的情况下,使其更易理解,修改成本更低。
重构过程包括去除重复、简化复杂逻辑和澄清模糊的代码。要保证重构的安全性,必须确保所做的修改不会产生任何破坏,这需要进行手工测试或者自动化测试。循序渐进的进行重构有处于防止增加缺陷。

重构的动机:

  • 使新代码的增加更容易
  • 改善既有代码的设计
  • 对代码理解更透彻
  • 提高编程的趣味性
Read more »

DbUnit是一个意在对使用数据库驱动项目进行测试的JUnit扩展。它使得你的数据库在各个Test之间处于一个已知的状态。这很好的解决了以下问题:当一个测试破坏了数据库时,导致其后面的所有测试失败或给出了错误的结果。

DbUnit原理

DbUnit通过维护真实数据库与数据集(DataSet)之间的关系来发现与暴露测试过程中的问题。此处DataSet可以自建,可以由数据库导出,并以多种方式体现,xml文件、XLS文件和数据库查询数据等,一般多用XML文件。在测试过程中,DataSet被称为期望结果(expected result),真实数据库被称真实结果(actual result),你所要做的就是通过DbUnit完成期望结果与真实结果之间的操作与比较,从而发现问题和校验结果。
DbUnit包括三个核心部分:

  • IDatabaseConnection :描述DbUnit数据库连接接口;
  • IDataSet:数据集操作接口;
  • DatabaseOperation:描述测试用例测试方法执行前与执行后所做操作的抽象类;
Read more »

Mockito 是目前 java 单测中使用比较流行的 mock 工具。其他还有 EasyMock,JMock,MockCreator,Mockrunner,MockMaker 及 PowerMock。

项目地址:https://code.google.com/p/mockito/

powermock 简介

EasyMock 以及 Mockito 都因为可以极大地简化单元测试的书写过程而被许多人应用在自己的工作中,但是这两种 Mock 工具都不可以实现对静态函数、构造函数、私有函数、Final 函数以及系统函数的模拟,但是这些方法往往是我们在大型系统中需要的功能。PowerMock 是在 EasyMock 以及 Mockito 基础上的扩展,通过定制类加载器等技术,PowerMock 实现了之前提到的所有模拟功能,使其成为大型系统上单元测试中的必备工具。缺点是缺少文档。

项目地址:https://code.google.com/p/powermock/

Read more »

除非你的项目是Apache或者Codehaus管理的,否则你是不可能直接把artifacts发布到Maven Central的。然而,Sonatype提供了它们的Nexus repositories,我们可以将开源项目提交上去,然后会自动同步到Maven Central。

下面介绍下如何做:

准备工作

1.添加source code management信息到pom.xml:

1
2
3
4
5
<scm>
<connection>scm:git:git@github.com:blueshen/ut-maven-plugin.git</connection>
<developerConnection>scm:git:git@github.com:blueshen/ut-maven-plugin.git</developerConnection>
<url>git@github.com:blueshen/ut-maven-plugin.git</url>
</scm>

2.创建GPG的密钥对并发布公钥。参看Sonatype documentation的具体步骤。推荐使用Linux,Mac来发布。

gpg --gen-key 创建key
gpg --list-keys 查看所有的key
gpg --send-keys --keyserver pool.sks-keyservers.net yourkey 发布你的key到常见服务器上,如果出现找不到key的话,多发几个服务器

3.确保你的工程POM符合要求
4.创建一个Sonatype JIRA账户,并发布一个ticket来让Nexus repository建立。用户名,密码后面要用的。这中间牵涉到人工操作,会花费一些时间。

Read more »

Eclipse中有个Outline视图,这个视图内可以显示类的各种信息,包括属性、方法等。同时在这个视图内点击哪里,就能定位的类什么地方。这是个神奇的东西,那么它是如何实现的呢?其实就是AST(Abstract Syntax Tree),抽象语法树了。利用这个来对Java源码进行解析。
另外,Eclipse有一个AST View插件,使用这个能更加的清楚的看到解析后的效果。

Eclipse AST View

Read more »

Eclipse AST

Eclipse AST 是 Eclipse JDT 的一个重要组成部分,定义在包 org.eclipse.jdt.core.dom 中,用来表示 Java 语言中的所有语法结构。
Eclipse AST 采用工厂方法模式和访问者模式 (见 2.7节)来设计和实现,这样可以减轻用户深入了解其内部结构的压力,并且方便用户利用它们构建并处理 AST。你可以打开 Eclipse 帮助页面,通过鼠标依次点击窗口左边的目录“JDT Plug-in Developer Guide” –>“Reference” –>“API Reference” Æ“org.eclipse.jdt.core.dom”,即可打开这个包的详细说明。本节将对这个包中重要的类作简要说明,为简便起见,这里省去这些类的包名,即org.eclipse.jdt.core.dom。
在 Eclipse AST 中,与本书的课程设计相关的类主要有以下三部分:

  • ASTNode 类及其派生类:用于描述各种 AST 节点的类,每个 AST 节点表示一个Java 源程序中的一个语法结构,例如,一个名字、类型、表达式、语句或声明等。
  • AST 类:创建 AST 节点的工厂类,类中包含许多创建各类 AST 节点的工厂方法,用户可以利用这些方法来构建 AST。
  • ASTVisitor 类:
    AST 的访问者抽象类,类中声明了一组访问各类 AST 节点的 visit( )方法、endVisit( )方法和 preVisit( )方法。
Read more »

TestNG annotaion:

  • @DataProvider
  • @ExpectedExceptions
  • @Factory
  • @Test
  • @Parameters

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<suite name="ParametersTest">
  <test name="Regression1">
    <classes>
      <class name="com.example.ParameterSample" />
      <class name="com.example.ParameterTest">
        <mtehods>
          <include name="database.*" />
          <exclude name="inProgress" />
        </methods>
      </class>
    </classes>
  </test>
  <test name="Parameters">
    <packages>
      <package name="test.parameters.Parameter*" />
    </packages>
  </test>
</suite>

一个suite(套件) 由一个或多个测试组成。
一个test(测试) 由一个或多个类组成
一个class(类) 由一个或多个方法组成。

@BeforeSuite/@AfterSuite 在某个测试套件开始之前/在某个套件所有测试方法执行之后
@BeforeTest/@AfterTest 在某个测试开始之前/在某个测试所有测试方法执行之后
@BeforeClass/@AfterClass 在某个测试类开始之前/在某个类的所有测试方法执行之后
@BeforeMethod/@AfterMethod 在某个测试方法之前/在某个测试方法执行之后
@BeforeGroup/@AfterGroup 在某个组的所有测试方法之前/在某个组的所有测试方法执行之后

Read more »

selenium常见问题


原文:https://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions

Q:什么是WebDriver?

A:WebDriver是一个用来写网页自动化测试的工具。它致力于模拟真实用户的行为并尽可能的实现HTML上的交互。

Q:Selenium与Sahi有什么异同?

A:它们的目标是一样的,都是为了测试webapp。但是,它们的实现是不一样的。WebDriver是直接控制浏览器的,而不是在浏览器内运行了一个Javascript应用(这牵涉到同源策略问题)。这也意味着WebDriver可以充分利用原生平台提供的任何工具。

Q:什么是Selenium 2.0?

A:WebDriver是Selenium的一部分。而WebDriver为其提供了强大的API以及原生的Driver。

Read more »