转自: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内的用例脚本都运行一遍了。

运行完成后,测试报告如下图所示:
测试报告