A. 怎么写android手机游戏测试用例
第一项:游戏安装
游戏安装后是否与安卓软件版本(手机环境)兼容
游戏安装后是否会影响到其他软件的使用
游戏安装后是否有优化功能
游戏安装包是否过大
游戏安装包是否安全,无病毒、木马等恶意破坏性程序
游戏安装后显示的游戏图标(App Icon)是否显示正常
......
第二项:游戏画面与文字
游戏界面是否能依照手机的屏幕摆放位置来进行有效的横/竖屏切换
游戏画面是否在游戏开启后运行流畅
游戏画面是否符合游戏风格
游戏画面是否符合大众的审美观,并无敏感性因素
游戏画面是否符合屏幕分辨率的标准,无显示不完整等异常现象
游戏文字是否显示清晰
游戏文字是否美观,并与游戏画面相匹配
游戏文字是否符合大众人的审美观,并没有敏感性词汇
游戏文字是否汉化完整
游戏文字是否能根据语言的设置进行多国语言文字的切换
游戏文字是否出现错别字、繁体字(某些状况可以考虑使用繁体字)、火星文等文字
......
第三项:游戏声音
游戏背景音乐是否能在游戏运行时播放
游戏背景音乐是否出现播放延迟、播放提前等播放不同步现象
游戏背景音乐是否与游戏风格相符合
游戏音效是否能在游戏运行时播放,并无不同步现象
游戏背景音乐和音效是否符合大众的审美观,并没有敏感性因素
当进入通话状态时,是否出现声音混合现象
游戏声音是否出现变形
......
第四项:游戏核心功能(可玩性)
游戏玩家基本动画(站立、行走、奔跑、基本攻击、技能攻击等)播放是否正常
游戏在运行时是否出现死机、黑屏、崩溃等严重影响游戏体验的现象
任务系统是否完善、是否出现描述错误、当前任务与进行中的任务不匹配等现象,达到任务要求后能否提交任务,提交任务后任务能否完成,任务完成的奖励是否正确
游戏剧情(世界观)是否符合大众的审美观,并没有敏感性因素
游戏玩家能否正常的攻击怪物、拾取物品、受到伤害,玩家生命值为0时能否正常死亡
游戏敌人(怪物或对手)能否正常的攻击玩家、受到伤害,敌人(怪物或对手)生命值为0时能否正常死亡
玩家与敌人(怪物或对手)的生命值、法力值等是否显示正常(包括数值和血条),受到攻击后,生命值是否下降,释放技能后,法力值是否下降(包括数值和血条)
杀死敌人(怪物或对手)后,物品的掉落和经验值的奖励是否正常
玩家的攻击力、防御力等数值计算是否正确,当玩家强化装备后,攻击力、防御力等数值能否上升
玩家的背包系统是否完善,能否实现拾取物品后物品出现在背包内,当背包超出负重上限或物品栏满栏的时候是否还能捡取物品,能否在背包内实现物品出售、物品修理等功能,背包内的物品信息是否显示正确,使用后能否出现效果。
游戏是否具备自动寻路等导航功能,若有,该功能是否完善,玩家、宠物、坐骑和怪物的跟踪是否正常
当玩家的装备的持久度不足时,攻击力、防御力能否受到影响
进入游戏后,游戏场景的渲染、纹理是否显示正常
NPC的功能是否能实现
游戏每个功能按键是否可以点击,点击后是否出现点击后的效果
游戏虚拟杆是否可以正常的控制玩家的移动,游戏的虚拟按钮是否可以正常的控制玩家的攻击
行会系统、好友系统以及结婚系统是否完善,玩家列表是否是当前状态的玩家列表
游戏是否有PK系统(PVE、PVP),若有,该功能是否完善
游戏是否具备组队功能,若有,该功能是否完善
物品出售时金币计算是否正确
游戏关卡的小地图显示是否正常,地图图标是否和玩家、敌人(怪物或对手)同步
游戏的记时是否连续、一致(指来电后时间继续,从来电时刻开始计时)
玩家的游戏体验是否方便
游戏说明是否与游戏操作功能保持一致
游戏界面的跳转是否正常
新手玩家的前期体验是否快速方便,玩家等级的提升是否快速,是否能给玩家带来一定的紧张刺激感
退出游戏后,游戏信息能否正确存档
......
第五项:充值与商城系统
商城内物品价格是否合理
能否通过花费的现金来兑换一定量的虚拟游戏币(基本充值功能的实现)
购买商品后,商品信息能否正确显示,使用后能否出现效果
能否通过游戏官方、支付宝、微信等支付现金来实现充值交易
点击充值按钮后能否进入官方充值网站
商城内物品的上架/下架是否及时,是否有折扣等福利性活动
......
第六项:游戏中断测试
被测游若与时间相关(游戏中有记时功能),来电后时间是否与来电前一致
游戏待机后,游戏能否暂停并关闭屏幕,并且来电或其他优先操作后,游戏能否暂停,并无其他异常现象(死机、黑屏、崩溃等)。
游戏中不同的界面来电时,来电提示正常,接听,挂断电话等操作后,返回游戏是否出现异常。
游戏中不同的界面手机来短信时,短信提示正常,回复短信后返回游戏是否出现异常
游戏中不同的界面来电时,来电提示正常,接听,挂断电话等操作后,返回游戏后游戏音效是否出现异常
游戏中不同的界面手机来短信时,短信提示正常,回复短信后返回游戏后游戏音效是否出现异常
......
第七项:游戏其他功能
游戏注册是否有实名制
游戏是否有未成年人防沉迷系统
游戏的安全防护措施是否到位(仓库锁、登录锁、游戏物品锁等)
游戏获得的成就能否通过QQ、微信、支付宝等与联系人分享
......
B. 如何使用python做android的自动化测试
开始第一个简单的Android UI自动化测试
1.使用adb命令连接真机或模拟器
2.打开uiautomatorviewer工具
3.使用uiautomatorviewer工具获取应用的元素进行定位
4.简单介绍unittest框架的使用方法
5.使用Python编写猫宁考勤应用注册模块的自动化测试
1.使用adb命令连接真机或模拟器:
手机USB连接电脑,进入开发者模式;
cmd命令:adb devices ,查看手机是否连接
这里写图片描述
显示错误
这是因为adb的端口被占用,我们需要查看是什么应用占用了这个端口(5037为adb默认端口)
cmd命令 : netstat -aon|findstr “5037”
这里写图片描述
可以看到占用5037端口对应的程序的PID号为8388;
cmd命令 : tasklist|findstr “8388”
这里写图片描述
可以看出8388对应的程序为kadb.exe,说明该程序正在使用5037端口;
这时我们需要在任务管理器中结束kadb.exe进程,按快捷键“Ctrl+Shift+Esc”调出Windows任务管理器,找到“kadb.exe”,单击下方的结束进程即可!
这里写图片描述
我们再次运行cmd命令:adb devices
这里写图片描述
这一步成功后我们才能运行sdk自带的uiautomatorviewer;
我们需要用uiautomatorviewer工具来获取元素,用于定位。
cmd命令:uiautomatorviewer,打开uiautomatorviewer界面
这里写图片描述
或者找到sdk目录:sdk\tools中找到uiautomatorviewer.bat文件双击运行
这里写图片描述
2.打开uiautomatorviewer工具
这里写图片描述
我们可以根据text,resource-id,class等元素进行定位
3.使用uiautomatorviewer工具获取应用的元素进行定位
这里我使用python自带的IDLE进行编写测试脚本,打开python文件找到IDLE(python GUI)双击打开,如图:
这里写图片描述
4.简单介绍unittest框架的使用方法
# -*- coding:utf-8 -*-
from uiautomator import device as d
import unittest
class Mytest(unittest.TestCase):
#初始化工作
def setUp(self):
print "--------------初始化工作"
#退出清理工作
def tearDown(self):
print "--------------退出清理工作"
#测试点击猫宁考勤case
def test_login(self):
d(text="猫宁考勤").click()
print "--------------测试1"
#测试2
def test_z(self):
print "--------------测试2" #这里你可以写你的第二个测试用例,
#测试3
def test_w(self):
print "--------------测试3" #这里你可以写你的第三个测试用例。。。。。。。。。。。。。
if __name__ == '__main__':
unittest.main()
结果如下:
Testing started at 21:14 …
————–初始化工作
————–测试1
————–退出清理工作
————–初始化工作
————–测试3
————–退出清理工作
————–初始化工作
————–测试2
————–退出清理工作
Process finished with exit code 0
从结果中我们可以看出unittest框架的运行方式为:
setUp 测试1 tearDown
setUp 测试2 tearDown
setUp 测试3 tearDown
5.使用Python编写猫宁考勤应用注册模块的自动化测试
# -*- coding:utf-8 -*-
from uiautomator import device as d
import time
import unittest
class MyTestSuite(unittest.TestCase):
# 初始化工作
def setUp(self):
print "--------------初始化工作"
# 退出清理工作
def tearDown(self):
print "--------------退出清理工作"
#***************************方法**************************************
# 判断控件是否存在 & text
def check_controls_exists(self, controls_text):
if d(text=controls_text).exists:
return 1
else:
return 0
# 判断按钮是否置灰 & text & clickable
def check_controls_click_text(self, controls_text):
if d(text=controls_text).info.get("clickable") is True:
return 1
else:
return 0
#assertIn(a, b) a in b
def check_ainb(self,resourceid,b):
if d(resourceId=resourceid).info.get("text") in b:
return 1
else:
return 0
#***********************************************************
# 注册模块
def test_Aregister(self):
try:
time.sleep(2)
#猫宁考勤开启全新时代
self.assertEqual(self.check_controls_click_text("注册"),1,u"猫宁考勤开启全新时代")
# 猫宁考勤开启全新时代--》点击注册按钮进入注册猫宁界面
d(text="注册").click()
time.sleep(3)
#注册猫宁界面
self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_phone","请输入手机号码"),
1,u"注册页面-》请输入手机号码")
self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_verifycode","请输入验证码"),
1,u"注册页面-》请输入验证码")
self.assertEqual(self.check_controls_click_text("获取验证码"), 0,u"注册页面-》获取验证码")
self.assertEqual(self.check_controls_click_text("《中科爱讯服务协议》"), 1,u"注册页面-》《中科爱讯服务协议》")
self.assertEqual(self.check_controls_click_text("注册"), 0,u"注册页面-》注册")
time.sleep(2)
#《中科爱讯服务协议》
d(text="《中科爱讯服务协议》").click()
time.sleep(2)
self.assertEqual(self.check_ainb("com.isentech.attendancet:id/title","服务协议"), 1,u"注册页面-》服务协议")
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/title_back").click()
time.sleep(1)
#手机号不输入是否能注册
d(text="注册").click()
time.sleep(3)
# 手机号只输入1个数字是否能注册&只输入1个数字是否能获取验证码
d(resourceId="com.isentech.attendancet:id/regis_phone").set_text("1")
self.assertEqual(self.check_controls_click_text("获取验证码"), 0)
time.sleep(1)
d(text="注册").click()
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_phone").clear_text()
time.sleep(1)
#只输入5个数字是否能获取验证码
d(resourceId="com.isentech.attendancet:id/regis_phone").set_text("11111")
self.assertEqual(self.check_controls_click_text("获取验证码"), 0)
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_phone").clear_text()
time.sleep(1)
#只输入手机号是否能注册
d(resourceId="com.isentech.attendancet:id/regis_phone").set_text(phone_number)
self.assertEqual(self.check_controls_click_text("注册"), 0)
time.sleep(1)
d(text="注册").click()
time.sleep(1)
#输入正确的验证码&获取验证码是否高亮
d(resourceId="com.isentech.attendancet:id/regis_verifycode").set_text("5648")
time.sleep(1)
self.assertEqual(self.check_controls_click_text("获取验证码"), 1)
time.sleep(2)
#密码只输入1个数字是否能注册&注册按钮是否高亮
d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("1")
d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("1")
time.sleep(1)
self.assertEqual(self.check_controls_click_text("注册"), 0,u"密码只输入1个数字是否能注册")
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_pass").clear_text()
d(resourceId="com.isentech.attendancet:id/regis_passAgain").clear_text()
time.sleep(1)
#输入不相同的密码是否能注册
d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("123456")
d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("12345")
time.sleep(1)
self.assertEqual(self.check_controls_click_text("注册"), 0,u"输入不相同的密码是否能注册")
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_pass").clear_text()
d(resourceId="com.isentech.attendancet:id/regis_passAgain").clear_text()
time.sleep(1)
#输入正确的密码是否能注册&我已同意是否打钩
d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("123456")
d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("123456")
time.sleep(1)
self.assertEqual(self.check_controls_click_resourceId("com.isentech.attendancet:id/regis_agree"), 1)
self.assertEqual(self.check_controls_click_text("注册"), 1)
time.sleep(2)
d(text="注册").click()
time.sleep(8)
except Exception, e:
print u"Error: 注册模块有问题\n", e
def test_app():
test_unit = unittest.TestSuite()
test_unit.addTest(MyTestSuite("test_Aregister"))
if __name__ == "__main__":
# 测试app
unittest.main()