最近开始用groovy写一个自动化测试,还算比较通用,有命令行ui
还有待完善
测试运行-命令行
cd到项目根目录下即 autotest.groovy所在目录执行命令
目前所有的命令集如下:
test_all 测试所有脚本
test_package 包名 测试script目录下的指定目录下的脚本
例:test_package script.abc
test_script 包名.脚本名 测试script目录下的指定文件脚本
例:test_script script.abc.TestClass
test_function 包名.脚本名.方法名 测试指定脚本的指定测试功能(方法)
例:test_function script.abc.TestClass.methodA
generate_script 包名.脚本名 创建测试脚本
例:generate_script. abc.TestClass
如果 命令后加 -i 则会进入交互模式 如test_package -i abc
在交互模式下如果 出现程序异常或断言错误可以选择是否继续进行下面的测试
最后日志存放在www/log下
测试运行-图形界面
cd到项目根目录 执行testui.groovy
打开浏览器 http://localhost:8088/test/
如上图
分4个区域
top区域:点击<!--[if gte vml 1]><v:shape id="图片_x0020_10" o:spid="_x0000_i1026" type="#_x0000_t75" style='width:22.5pt;height:10.5pt;visibility:visible; mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image003.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->可以切换皮肤风格,点击测试全部可以对所有的测试脚本进行测试,点击历史日志可以查看所有www/log下的历史日志文件,点击清空控制台会将控制台中所有选项卡的信息清除
包/脚本区:显示的是script下存放的包和脚本,右击菜单选择run可以执行包下测试脚本或单个测试脚本
方法区:点击包/脚本区的测试脚本时,如果测试脚本下有测试方法那么可以右击菜单选择run直接运行指定的测试方法
控制台:
在执行测试后的日志展示区域,日志存放在www/log,点击<!--[if gte vml 1]><v:shape id="图片_x0020_13" o:spid="_x0000_i1025" type="#_x0000_t75" style='width:15pt; height:7.5pt;visibility:visible;mso-wrap-style:square'> <v:imagedata src="file:///C:\Users\ADMINI~1\AppData\Local\Temp\msohtmlclip1\01\clip_image005.png" o:title="" /> </v:shape><![endif]--><!--[if !vml]--><!--[endif]-->可以开启或暂停对当前选项卡的测试日志的监控
测试脚本编写
测试脚本需要使用groovy脚本语言编写
脚本必须放在根目录下script包下,script下最多支持1级目录
测试脚本必须继承testbase.TestBase类
需要进行测试方法必须在方法上使用@TestCase 标注
例:@TestCase(function='将符合标准的职位对象持久化',timelimit=12l)
TestCase表示此方法需要测试,function内容说明该测试方法测的业务规则(可选),timelimit为方法允许的最大耗时上限(可选)为12ms
以下是两个完整的测试方法例子(查询及添加):
//职位view模拟
static Appointment newAppointment(){
def appointment = new Appointment()
appointment.setAppointmentDesc("测试描述")
appointment.setAppointmentResourceMstrId(new BigDecimal(112))
//appointment.setAppointmentType('测试类型')
appointment.setAppointmentStatus('测试状态')
appointment.setAppointmentBeginDateTime(new Timestamp(System.currentTimeMillis()))
appointment.setAppointmentEndDateTime(new Timestamp(System.currentTimeMillis() + 100000))
appointment.setCreatedBy(0)
return appointment
}
@TestCase(function='查找到正确的职位集合',timelimit=12l)
void searchAppointmentList() {
//session 设置
initSession(0)
//view设置
def searchView0 = new AppointmentSearchView()
searchView0.setAppointmentResourceMstrId(new BigDecimal(573));
//测试逻辑
AppointmentCommonService service = RemoteProxyFactory.getService(AppointmentCommonService.class)
List<AppointmentInfoView> rs = service.searchAppointmentList(searchView0)
//println rs['cscsc']
//测试验证
assert rs.isEmpty() == false
}
@TestCase(function='将符合标准的职位对象持久化',timelimit=12l)
void createAppointment() {
//会话设定
initSession('ktadmin')
//模拟对象验证
def appointment = newAppointment()
assert appointment.getAppointmentType() != null,'职位类型必须填写'
assert appointment.getAppointmentStatus() != null,'职位状态必须填写'
//测试逻辑
AppointmentCommonService service = RemoteProxyFactory.getService(AppointmentCommonService.class)
Appointment rs = service.createAppointment(appointment)
println rs.appointmentId
assert rs != null
}
session有多种方式可以设置
1) initSession (20, null, null, null, null, null, null, null, null, null, null, null) 新设置一个session
2) initSession ('ktadmin') 获取一个当前的session 可在testbase.Sessions中添加
4)initSession(int userId,int roleId )
5)initSession(int userId,int roleId,int localId)
...
服务端的方法通过 RemoteProxyFactory.getService(AppointmentCommonService.class) 方式构造