35、Selenium + Python 实现 UI 自动化测试-正片7

来源:互联网 发布:高德交通大数据 编辑:程序博客网 时间:2024/06/04 20:18

首先,我们回顾一下前面的知识。

1、我们创建不同的目录用来分类储存文件,包括:

(1)cases目录,用来存储用例;

(2)common目录,用来存储公共函数供用例调用;

(3)config目录,用来存储配置文件,将一些易变的配置项从代码分离;

(4)report目录,用来存储报告文件

(5)utils 目录,用来存储工具类,比如一些读配置文件的函数或方法;

2、实现的功能,包括:

(1)自动执行测试;

(2)生成HTML报告;

(3)将报告通过邮件发给相关人;


本节我们来丰富一下测试用例:以登录为例,之前我们只测试了正确的用户名、密码能登录成功。现在我们细化一下测试用例:

(1)正确的用户名、密码;

(2)错误的用户名、密码;

(3)空用户名、密码;


接下来修改一下test_000_login.py文件,内容如下:

import unittestfrom selenium import webdriverimport timefrom time import sleepfrom first.utils import readyamlclass TestLogin(unittest.TestCase):    def setUp(self):        self.driver = webdriver.Chrome()        self.driver.implicitly_wait(20)        self.driver.maximize_window()        url = readyaml.read_yaml('url')        self.driver.get(url)    def test_login1(self):        self.driver.find_element_by_id('username').clear()        self.driver.find_element_by_id('username').send_keys('admin')        self.driver.find_element_by_id('password').clear()        self.driver.find_element_by_id('password').send_keys('test1234')        self.driver.find_element_by_id('login-submit').click()        # 如何判断是否登录成功呢?登录成功后右上角有用户名        ele = self.driver.find_element_by_xpath('//*[@id="loggedas"]/a').text        self.assertEqual(ele,"admin")    def test_login2(self):        self.driver.find_element_by_id('username').clear()        self.driver.find_element_by_id('username').send_keys('admin')        self.driver.find_element_by_id('password').clear()        self.driver.find_element_by_id('password').send_keys('test12345')        self.driver.find_element_by_id('login-submit').click()        ele = self.driver.find_element_by_id('flash_error').text        self.assertEqual(ele,"无效的用户名或密码")    def test_login3(self):        self.driver.find_element_by_id('username').clear()        self.driver.find_element_by_id('username').send_keys('')        self.driver.find_element_by_id('password').clear()        self.driver.find_element_by_id('password').send_keys('')        self.driver.find_element_by_id('login-submit').click()        ele = self.driver.find_element_by_id('flash_error').text        self.assertEqual(ele, "无效的用户名或密码")    def tearDown(self):        self.driver.quit()if __name__ == '__main__':    TestLogin()

上面3条测试用例执行步骤都是一样的,只不过输入值不一样,然后判断不同的结果。代码重复度高,并且,如果我们要再增加测试用例的话(不同输入,输出),还需要修改测试代码。

改进:我们在目录下新建文件夹data用来存储用例文件,新建Excel 来维护测试用例,后面增加或修改测试用例,只需要修改Excel表即可。如果需要的话,每条case对应一个Excel表,Excel表名称和用例名称相同。比如这里我们新建Excel 名称为:test_000_login.xlsx


我们故意将用例1和3的预期结果修改错,制造两条失败的用例


调整test_000_login.py 代码如下:

我们从Excel 读入数据,执行登录动作。

import unittest,osfrom selenium import webdriverimport timefrom time import sleepfrom first.utils import readyaml,readexcelimport xlrdfrom xlutils.copy import copyclass TestLogin(unittest.TestCase):    def setUp(self):        self.driver = webdriver.Chrome()        self.driver.implicitly_wait(20)        self.driver.maximize_window()        url = readyaml.read_yaml('url')        self.driver.get(url)    def test_login1(self):        base_path = os.path.dirname(os.path.abspath(__file__))        data_path = base_path + '\..\data\\test_000_login.xlsx'        wb = xlrd.open_workbook(data_path)  # 打开用例文件        sheet = wb.sheet_by_index(0)  # 打开第一个标签        row = 0        for row in range(sheet.nrows):            if row == 0:                pass            else:                name = sheet.cell(row, 2).value                password = sheet.cell(row, 3).value                way = sheet.cell(row, 4).value                value1 = sheet.cell(row, 5).value                expect_res = sheet.cell(row, 6).value                self.driver.find_element_by_id('username').clear()                self.driver.find_element_by_id('username').send_keys(name)                self.driver.find_element_by_id('password').clear()                self.driver.find_element_by_id('password').send_keys(password)                self.driver.find_element_by_id('login-submit').click()                sleep(2)                # 如何判断是否登录成功呢?登录成功后右上角有用户名                try:                    ele = self.driver.find_element(way,value1).text                    if ele == expect_res:                        print('pass')                    else:                        print('fail')                except:                    print('fail')    def tearDown(self):        self.driver.quit()if __name__ == '__main__':    TestLogin()
运行结果:

C:\Python36\python.exe "C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2016.1.2\helpers\pycharm\utrunner.py" E:\python\test1\first\cases\test_000_login.py::TestLogin::test_login1 true
Testing started at 9:57 ...
fail
pass
fail


Process finished with exit code 0


小结:

1、引入Excel 保存用例,将数据和代码分离

2、但是目前这样写有很大的问题:问题1,没有讲测试结果回写到Excel表;问题2,和之前用的unittest 框架 assert不统一,这样会导致统计不到错误结果

阅读全文
0 0
原创粉丝点击