前段时间自己练手作的,练习Appium,当然不能放过calculator。话不多说,要先有个简单的框架,上图:
麻雀虽小,五脏俱全
报告和测试用例脚本要分开放(非强制,但最好)。只写了一个测试用例脚本,简单的测试加减乘除,如果更复杂了,可以在test_case下细分不同用处的脚本。对于相同的action,完全可以在test_case的同级目录下创建common文件夹,来放置公用的一些类以及函数。类似功能的代码重写是严重浪费生产力的。
# -*- coding: utf-8 -*-
import time
import os
import unittest
import HTMLTestRunner
from appium import webdriver
class CalculateTest(unittest.TestCase):
@classmethod # 只初始化一次,并不是每次用例执行都进行初始化
def setUpClass(cls):
# 毕竟练习,舍不得真刀实枪的用自己手机,下面是初始化的一些配置
desire_caps = dict()
desire_caps['platformName'] = 'Android'
desire_caps['platformVersion'] = '19'
desire_caps['deviceName'] = '192.168.99.100:5555'
desire_caps['appPackage'] = 'com.android.calculator2'
desire_caps['appActivity'] = '.Calculator'
cls.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desire_caps)
# 需要注意如果输入99的话,要进行两次‘9’.click(),计算器是点击,不是输入操作,当然也需要测试文本框是否接受输入操作,但本节不讲
def test_add(self):
self.driver.find_element_by_name('9').click()
self.driver.find_element_by_id('com.android.calculator2:id/plus').click()
self.driver.find_element_by_name('1').click()
self.driver.find_element_by_name('=').click()
result = self.driver.find_element_by_class_name('android.widget.EditText').text
# 设置断言,不然不管对错,最后得出的报告统统PASS,那就尴尬了。text的属性为str,断言内容在这前后格式要相同,不然得出的报告全部FAIL,那也尴尬了。
self.assertEqual(result, str(9+1))
self.driver.find_element_by_name('CLR') # 最后一定要清空,为下一个用例作准备
def test_substract(self):
self.driver.find_element_by_name('9').click()
self.driver.find_element_by_id('com.android.calculator2:id/minus').click()
self.driver.find_element_by_name('1').click()
self.driver.find_element_by_name('=').click()
result = self.driver.find_element_by_class_name('android.widget.EditText').text
self.assertEqual(result, str(9-1))
self.driver.find_element_by_name('CLR')
def test_multi(self):
self.driver.find_element_by_name('9').click()
self.driver.find_element_by_id('com.android.calculator2:id/mul').click()
self.driver.find_element_by_name('9').click()
self.driver.find_element_by_name('=').click()
result = self.driver.find_element_by_class_name('android.widget.EditText').text
self.assertEqual(result, str(9*9))
self.driver.find_element_by_name('CLR')
def test_div(self):
self.driver.find_element_by_name('9').click()
self.driver.find_element_by_id('com.android.calculator2:id/div').click()
self.driver.find_element_by_name('3').click()
self.driver.find_element_by_name('=').click()
result = self.driver.find_element_by_class_name('android.widget.EditText').text
self.assertEqual(result, str(int(9/3)))
self.driver.find_element_by_name('CLR').click()
@classmethod
def tearDownClass(cls): # 不要忘记收尾。
cls.driver.quit()
if __name__ == '__main__':
cal_suit = unittest.makeSuite(CalculateTest, 'test') # 构造testsuit,第一个参数为类名称,第二个参数为类中每个testcase的前缀名
path = os.path.abspath(os.path.dirname(os.getcwd())) # 此脚本的父级目录
report_time = time.strftime('%Y%m%d', time.localtime())
report_name = path + '\\report\\' + report_time + '-report.html' # 报告保存路径及名称
with open(report_name, 'wb') as fp:
# 生成报告未HTML格式,
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u'手机计算器测试报告', description=u'用例执行情况')
runner.run(cal_suit) # 开始执行
需要注意的事项在注释中已经声明了。操作起来还是较容易的。如果从无到有开始作的话,构建环境应该占一部分时间。这是很少的测试用例脚本,如果很多的话,一定要事先在脑子里构建一个框架,也画出来,那些函数会重用,哪些之前写过等等,先把框架构建好,后面写起来才会顺风顺水。
网友评论