单元测试框架(unittest)的安装:
<1> 使用pip命令: pip install unittest
<2> 在pycharm里安装
单元测试框架(unittest)的主要方法:
setUp(): 在每条用例开始前做准备工作
tearDown(): 在每条用例结束后做清除工作
setUpClass(): 在全部用例开始前做准备工作(仅做一次)
tearDownClass(): 在全部用例结束后做清除工作(仅做一次)
TestCase(): 测试用例,一般是写入一个类,让其继承
TestSuite(): 测试容器、测试套件,将用例放入
TestLoader(): 加载器,将测试套件放入后,会去寻找所有以test开头命名的测试用例
注意事项:
在单元测试框架中,所有的自动化用例都要以test_命名开头,且它是通过ACSII码值来进行转换,根据从小到大的顺序来执行用例
补充说明,装饰器:
@classmethod: 在方法上引用,表示这是一个动态类方法
@staticmethod; 在方法上引用,表示这是一个静态类方法
测试的apk: 一家民宿
自动化用例场景三种:
<1>进入一家民宿内----点击想去的目的地/景点/-------输入内容为北京----点击下拉内容的第一个----查看主页中的目的地是否与我输入的一致(也是北京)
<2> 进入一家民宿内—点击入住-退房日期----选择入住日期为明天(5-22日)----选择退房日期(5-23日)–点击确定----
获取主页内的入住日期是否与我输入的一致
<3> 进入一家民宿内----点击入住人数—选择人数为2位房客-----获取主页内入住人数是否是我选择的(2人)
一、准备工作,使用adb命令连接模拟器,打开appium,写入要测试的apk各个参数
noReset: 跳过引导页
二、启动会话,获取定位元素信息
三、代码实现:
import unittest
from appium import webdriver
import time
from appium.webdriver.common.touch_action import TouchAction
caps = {}
caps["platformName"] = "Android"
caps["platformVersion"] = "5.1.1"
caps["deviceName"] = "127.0.0.1:62001"
caps["appPackage"] = "me.onehome.app"
caps["appActivity"] = ".activity.ActivitySplash_"
class YJMS(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Remote("http://localhost:4723/wd/hub",caps)
self.driver.implicitly_wait(20) # 隐式等待,会等元素加载完去寻找
time.sleep(5)
TouchAction(self.driver).tap(x=207, y=1425).perform() # 点击立即开启
self.width = self.driver.get_window_size()['width'] # 做适配工作,获取当前手机的宽
self.height = self.driver.get_window_size()['height'] # 做适配工作 获取当前手机的高
def tearDown(self) -> None:
# 在每条用例结束后做清除工作,关闭app,提供良好的测试环境,互不干扰
self.driver.quit()
def test_001(self):
# 点击想去的目的地:
self.driver.find_element_by_id('me.onehome.app:id/tv_Destination').click()
# 输入内容:
input = self.driver.find_element_by_id('me.onehome.app:id/editText')
input.send_keys('北京')
# 点击下拉内容的第一个
time.sleep(3) # 因为是tap点击,所以先让下拉内容加载出来再去模拟手势去点击它
TouchAction(self.driver).tap(x=200, y=210).perform()
# 获取主页内容的文本信息,来与我输入的内容做断言,符合既通过,不符合既用例失败
result = self.driver.find_element_by_id('me.onehome.app:id/tv_Destination').get_attribute('text')
# 判断 是否包含
unittest.TestCase().assertIn(result, "北京市", msg='用例失败')
def test_002(self):
#点击入住-退房日期
self.driver.find_element_by_id('me.onehome.app:id/tv_check_data').click()
#选择入住日期为明天(5-22日)
x = 697/900
#做适配工作,可以让代码在不同的分辨率下正常运行,697为要点击的x位置,900为分辨率的宽,获取的是要点击内容的x值占比
y = 882/1600
# 做适配工作,可以让代码在不同的分辨率下正常运行,882为要点击的x位置,1600为分辨率的宽,获取的是要点击内容的y值占比
time.sleep(5)
TouchAction(self.driver).tap(x = x*self.width,y = y*self.height).perform()
# 选择退房日期(5-23日)
x = 840/900
y = 886/1600
time.sleep(5)
TouchAction(self.driver).tap(x = x*self.width,y = y*self.height).perform()
# 点击确定:
self.driver.find_element_by_id('me.onehome.app:id/confirmTv').click()
# 获取一家民宿主页内的入住信息,以文本信息返回
result = self.driver.find_element_by_id('me.onehome.app:id/tv_check_data').get_attribute('text')
# 断言预期结果与实际结果是否相等:
self.assertEqual("05月22日-05月23日 共1晚",result)
def test_003(self):
#点击入住人数 - --
renshu = self.driver.find_element_by_id('me.onehome.app:id/tv_check_person_Sum')
renshu.click()
# 选择人数为2位房客
x = 137/900
y = 340/1600
time.sleep(3) #任何tap点击前都要等待下,因为tap点击是瞬时操作,与element(定位元素)不同
TouchAction(self.driver).tap(x = x*self.width,y = y*self.height).perform()
# 获取主页内入住人数是否是我选择的(2)
time.sleep(2)
result = self.driver.find_element_by_id('me.onehome.app:id/tv_check_person_Sum').get_attribute('text')
self.assertEqual("2位房客",result)
if __name__ == '__main__':
unittest.main(verbosity=3) # verbosity 后面 = 是用例的条数,可以清晰的看到哪条用例通过,哪条未过
四、运行结果
需要注意的是,运行方式要整篇运行,首先要将当前的.py文件路径复制并放入以python的运行方式,示例:
最后run 运行