#Python#一个简单的Appium自动化测试//unittest

前段时间自己练手作的,练习Appium,当然不能放过calculator。话不多说,要先有个简单的框架,上图:


#Python#一个简单的Appium自动化测试//unittest_第1张图片
麻雀虽小,五脏俱全

报告和测试用例脚本要分开放(非强制,但最好)。只写了一个测试用例脚本,简单的测试加减乘除,如果更复杂了,可以在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) # 开始执行

需要注意的事项在注释中已经声明了。操作起来还是较容易的。如果从无到有开始作的话,构建环境应该占一部分时间。这是很少的测试用例脚本,如果很多的话,一定要事先在脑子里构建一个框架,也画出来,那些函数会重用,哪些之前写过等等,先把框架构建好,后面写起来才会顺风顺水。

你可能感兴趣的:(#Python#一个简单的Appium自动化测试//unittest)