Cucumber学习笔记

Cucumber是什么

简单的说:Cucumber就是一个行为驱动开发工具,它有一套用例描述文件(.feature),可以用接近业务的语言描述一个用例,根据该描述文件,可以关联对应的程序代码进行测试案例执行。该描述文件起到了一个沟通业务、测试、开发人员的桥梁作用。

关于移动工作站的一些想法

##背景

由于家里有两台电脑,公司有一台笔记本,而且公司的网络有各种限制(基本所有的网盘都访问不了),所以各种记录的笔记、实例代码逐渐散落在各台机器上了;另外每台机器上都要重复安装各种相同的软件,于是便萌生了想把各种软件/笔记/实例代码放在同一个环境的想法。

##方案

  1. 使用window8的windows to go,在移动硬盘中安装一个windows8,做一个随身携带操作系统。这个是我想到的最好的解决方案,但现实很骨感,家里的电脑无论怎么设置,通过移动硬盘启动之后,在出现windows圈圈那里一定会蓝屏,无奈放弃该方案(如果有人知道原因的话,欢迎告诉我)

  2. 退而求其次,将方案1中本来放到移动硬盘的vhdx文件放到主机的硬盘上,通过bootice设置好BCD文件后,可以正常启动,于是便通过人肉拷贝vhdx到移动硬盘的方式在各台机器上使用该vhdx。但又遇到了坑:在一台使用华硕主板的机器上使用这个vhdx的时候,会自动安装几个驱动,然后在另一台技嘉主板的机器上启动的时候就蓝屏了,于是这个方案又挂了。这个方案还有一个问题,vhdx文件有大概20G,有两台机器只有usb2.0,拷贝整个文件大概要20分钟,另外每次都要记得把文件copy到移动硬盘中,否则就无法干活了。

  3. 通过虚拟机安装一个虚机,同样通过移动硬盘在各台机器上同步。但还是有方案2的缺点,并且用虚拟机性能本来就有折扣,即使安装xubuntu,也没有太大改善,所以也只能作罢。

  4. 最后还是使用了方案2,但只在2台机器上使用vhdx,并在自己的群晖NAS上安装了Cloud Station,然后将各种笔记/实例代码放到上面进行同步。

##结论

移动硬盘上安装操作系统应该是比较好的解决方案,另外,如果windows可以推出一个类似docker的东西,里面可以安装各种软件,但内核使用的是宿主机器上的windows,这样可以大大减少这个docker的容量。

如果各位有更好的方法,也欢迎告诉我。

quickbuild-howto

在checkstyle和findbug查看源码时中文出现乱码

需要在wraper.conf文件中增加:

1
wrapper.java.additional.4=-Dfile.encoding=UTF-8

如何备份和恢复数据

quickbuild的帮助文档中查找database关键字可以找到,备份数据库可以在管理页面操作,恢复需要先停止quickbuild server,然后在命令行,去到$QuickBuild_HOME/bin/restore /path/to/backup_file

如何切换数据库

quickbuild默认使用H2内存数据库,如果需要切换成使用其他数据库,如MySQL,需要先备份数据库,然后停止quickbuild服务,修改 $QUICKBUILD_HOME/conf/hibernate.properties信息,然后恢复数据库,再启动服务

万恶的IE

如何指定IE使用最高版本渲染页面

紧接在<head>下一行添加

1
<meta http-equiv="X-UA-Compatible" content="IE=Edge">


如何令IE8或以下版本支持html5

<head></head>中增加

1
2
3
<!--[if lt IE 9]>
<script src="html5shiv.js"></script>
<![endif]-->


按上面的加上之后,在IE8兼容模式下正常,但将页面放到iframe里就不正常了

这个是IE iframe的问题,这里有提到:https://css-tricks.com/ie-iframe-quirksmode/,解决方法是将上面的改写成:

1
2
3
<!--[if IE]>
<script src="html5shiv.js"></script>
<![endif]-->

只要是IE浏览器,都加载html5shiv.js

在IE8如何支持字体图标

这个问题是在使用Bootstrap时遇到的,解决方法和上面的类似,就是在<head></head>中增加

1
2
3
4
<!--[if IE]>
<script src="html5shiv.js"></script>
<script src="respond.js"></script>
<![endif]-->

Java与中文不得不说的故事

URL.getPath()中被转换的中文如何还原

通常在获取一个文件或目录的路径时,会使用以下方法:

1
String path = this.getClass().getResource("fileOrDir").getPath();

但如果路径中含有中文或空格,path会包含各种转义后的字符,比较好的解决方案是:

1
2
String path = this.getClass().getResource("fileOrDir").getPath();
String actualPath = java.net.URLDecoder.decode(path, "utf-8");

关于单元测试

单元测试

How:

1. 单元测试是测试对象的行为,而不是测试单一方法本身
2. 单元测试是针对单一对象的行为进行测试,所以应该尽可能缩小对外部的依赖范围。例如A.a()方法依赖B,B又依赖C,这时候应该进行使用B的模拟对象进行A.a()的单元测试,而不要使用真实的B(POJO除外)

Why: 单元测试可以保障代码重构安全,使得重构能放心地进行,从而令开发人员有信心改善代码质量


如何模拟JNDI

背景

数据源的JNDI配置在应用服务器上,在单元测试时脱离了容器环境,如何令单元测试顺利执行?

方法

Spring中提供了类org.springframework.mock.jndi.SimpleNamingContextBuilder,可以将任意对象注册为JNDI对象,所以可以编写一个父类,先把JNDI对象注册好,子类初始化的时候就可以拿到该JNDI对象了,父类代码如下:

1
2
3
4
5
6
7
8
9
10
public class AbstractTest {
@BeforeClass
public static void setUpBeforeClass() throws NamingException {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:testDs.spring.xml");
SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();
builder.bind("jdbc/MySQLDS", ctx.getBean("testDs"));
builder.activate();
}

MySQL常见问题

如何创建用户

1
2
create user 'username'@'%' identified by 'password';
## %表示所有主机,还可以有localhost/ip

如何允许指定用户远程访问

以下以赋权root用户从任何机器远程访问任意数据库的任意表为例

1
mysql> grant all on *.* to 'root'@'%'';


修改用户密码

1
2
3
update mysql.user set password=PASSWORD(1234) where user='username'; ## 使用sql更新
set password for 'username'@'host'=PASSWORD('newpassword'); ## 使用命令更新

更新完之后有可能需要重启mysql服务,客户端才能生效

Tomcat常见问题

Tomcat如何配置JNDI数据源

以下配置在tomcat7下适用,以mysql配置为例

$CATALINA_HOME/conf/context.xml中增加

1
2
3
4
5
6
7
8
9
10
<Resource name="jdbc/testDB"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="100000"
username="user"
password="pass"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/testDB?characterEncoding=utf8"/>

并将mysql-connector-java.jarcopy到$CATALINA_HOME/lib目录下(貌似不copy也可以正常工作)

在应用中使用以下spring配置,可以获取数据源

1
2
3
4
<jee:jndi-lookup
id="dataSource"
jndi-name="jdbc/testDB"
resource-ref="true"/> <!-- resource-ref属性至关重要 -->

JBoss常见问题

最简单配置

设置好JAVA_HOME,执行

1
2
3
$JBOSS_HOME/bin/standalone.bat #windows
$JBOSS_HOME/bin/standalone.sh #linux

即可,默认端口为8080


应用中使用了Webservice,在tomcat中正常启动,但JBoss中启动报错

可注释JBoss中关于webservice的配置项试试,位置在$JBOSS_HOME/standalone/configuration/standalone.xml文件中,查找

1
2
3
<subsystem xmlns="urn:jboss:domain:webservices:1.2">
......
</subsystem>


jboss启动后,只能在本机通过localhost访问管理页面,无法从其他机器访问

可修改配置文件中的对外服务ip地址,位置在$JBOSS_HOME/standalone/configuration/standalone.xml文件中,查找

1
2
3
4
5
6
<interface name="public">
<!-- 原值 <inet-address value="${jboss.bind.address:127.0.0.1}"/> -->
<!-- 修改为只能通过指定ip访问 <inet-address value="${jboss.bind.address:192.168.1.100}"/> -->
<!-- 修改为所有可能的ip访问 -->
<inet-address value="${jboss.bind.address:0.0.0.0}"/>
</interface>


JBoss如何配置JNDI数据源

首先需要发布数据源的jdbc驱动,以mysql为例

  • 首先登录JBoss控制台,在Runtime->Server->Manage Deployments中,发布mysql-connector-java.jar,并启用
  • Profile->Datasources中,增加一个JNDI数据源,这时就可以选择mysql的jdbc驱动了,要注意的是,JBoss的JNDI的名字必须以java:/java:/jboss/开头,但强烈建议配置成java:/开头,这样以后在使用spring配置jndi时,统一使用以下配置,可以在各个中间件中统一命名
    1
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/recommend" resource-ref="true"/> <!-- resource-ref属性至关重要 -->