Appium实践:测试脚本结构优化
转自:http://blog.csdn.net/zhuquan0814/article/details/50935787
随着测试用例的增多,将所有用例写在一个脚本里显然不太科学,脚本会越来越长,维护起来十分麻烦。
所以我们需要优化一下结构,将每一个测试用例写成一个脚本并统一放到一个文件夹内,然后另外写一个脚本去执行这些用例脚本,当然也可以在此脚本中选择性地添加想要执行的用例脚本,这样做相对来说会好一点。
那么下面就介绍一下具体该怎么做:
先看下目录结构
(1)将所有的用例脚本统一放到一个文件夹中,如图中所示:文件夹为test_case(自行命名),而c1_tab.py和c2_login.py是用例脚本;
(2)在文件夹test_case内添加一个init.py脚本,名字必须为此,内容为空。因为要导入这个文件夹中的module,所以要先构建一个package,而package必须包含一个init.py文件。
然后来看下用例脚本
c1_tab.py
#coding:utf-8
import unittest
import os
from selenium import webdriver
from time import sleep
import HTMLTestRunner
import time
class tabTest(unittest.TestCase):
u'''切换tab'''
@classmethod
def setUpClass(cls):
print('开始执行tabTest')
desired_caps = {}
desired_caps['platformName'] = 'Android'
#desired_caps['deviceName'] = 'Nexus 5 API 21'
desired_caps['deviceName'] = '红米手机'
#desired_caps['autoAcceptAlerts'] = 'true'
#desired_caps['resetKeyboard'] = 'true'
desired_caps['unicodeKeyboard'] = 'true'
cls.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
print('执行结束')
def test_clicktab(self):#用例
u'''切到超模25tab,再切到我tab'''
self.driver.implicitly_wait(10)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.support.v7.app.ActionBar.e[2]").click()#切到超模25tab
sleep(3)
try:
self.assertEqual(int(self.driver.find_element_by_id('com.boohee.secret:id/tv_title').text),'超模25','切到超模25tab失败')#相等则pass
except:
self.driver.get_screenshot_as_file("/Users/zhuquan/Documents/Test-ZQ/error_png/切到超模25tab失败.png")
sleep(3)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.support.v7.app.ActionBar.e[3]").click()#切到我tab
sleep(3)
try:
self.assertEqual(int(self.driver.find_element_by_id('com.boohee.secret:id/tv_title').text),'我','切到我tab失败')#相等则pass
except:
self.driver.get_screenshot_as_file("/Users/zhuquan/Documents/Test-ZQ/error_png/切到我tab失败.png")
sleep(5)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(tabTest('test_clicktab'))#需要测试的用例就addTest,不加的就不会运行
#unittest.TextTestRunner(verbosity=1).run(suite)
timestr = time.strftime('%Y-%m-%d %X',time.localtime(time.time()))#本地日期时间作为测试报告的名字
filename = '/Users/zhuquan/Documents/Test-ZQ/report/'+timestr+'.html'#这个路径改成自己的目录路径
fp = open(filename,'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title='result',
description='report'
)
runner.run(suite)
fp.close()
c2_login.py
#coding:utf-8
import unittest
import os
from selenium import webdriver
from time import sleep
import HTMLTestRunner
import time
class loginTest(unittest.TestCase):
u'''登录账号'''
@classmethod
def setUpClass(cls):
print('开始执行loginTest')
desired_caps = {}
desired_caps['platformName'] = 'Android'
#desired_caps['deviceName'] = 'Nexus 5 API 21'
desired_caps['deviceName'] = '红米手机'
#desired_caps['autoAcceptAlerts'] = 'true'
#desired_caps['resetKeyboard'] = 'true'
desired_caps['unicodeKeyboard'] = 'true'
cls.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
print('执行结束')
def test_login(self):#用例
u'''切到我tab,进行登录操作'''
self.driver.implicitly_wait(10)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.support.v7.app.ActionBar.e[3]").click()#切到我tab
sleep(3)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.TextView[1]").click()#点击登录入口
sleep(2)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.EditText[1]").send_keys("testq1")#输入用户名
sleep(2)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[2]/android.widget.EditText[1]").send_keys("boohee")#输入密码
sleep(2)
self.driver.find_element_by_xpath("//android.widget.LinearLayout[1]/android.widget.Button[1]").click()#点击登录按钮
sleep(10)
try:
self.assertIsNotNone(self.driver.find_element_by_id('com.boohee.secret:id/tv_edit_profile'),'无编辑资料按钮,登录失败')#如果存在此元素则pass
except:
self.driver.get_screenshot_as_file("/Users/zhuquan/Documents/Test-ZQ/error_png/登录失败.png")
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(loginTest('test_login'))#需要测试的用例就addTest,不加的就不会运行
#unittest.TextTestRunner(verbosity=1).run(suite)
timestr = time.strftime('%Y-%m-%d %X',time.localtime(time.time()))#本地日期时间作为测试报告的名字
filename = '/Users/zhuquan/Documents/Test-ZQ/report/'+timestr+'.html'#这个路径改成自己的目录路径
fp = open(filename,'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title=u'超模25App测试结果',
description=u'超模25App自动化测试报告简述'
)
runner.run(suite)
fp.close()
下面是执行脚本
all_tests.py
#coding=utf-8
import unittest
import sys
sys.path.append("/test_case")
#添加test_case目录
from test_case import c1_tab,c2_login
import HTMLTestRunner
import time
alltestnames = [c1_tab.tabTest,
c2_login.loginTest,
]
#添加执行的测试用例
testunit = unittest.TestSuite()
for test in alltestnames:
testunit.addTest(unittest.makeSuite(test))
timestr = time.strftime('%Y-%m-%d %X',time.localtime(time.time()))
filename = '/Users/zhuquan/Documents/Test-ZQ/report/'+timestr+'.html'
fp = open(filename,'wb')
runner = HTMLTestRunner.HTMLTestRunner(
stream=fp,
title=u'超模25App测试结果',
description=u'超模25App自动化测试报告简述'
)
runner.run(testunit)
fp.close()
print('执行完毕,报告路径:'+filename)
最后,只要直接运行all_tests.py脚本就可以把文件夹test_case内的用例脚本都运行一遍了。
运行完成后,测试报告如下图所示: