天天看点

unittest单元测试框架介绍及8种元素定位方法总结

unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。

1.四个重要概念

(1)test fixture(测试固件):测试执行前的准备动作和测试结束后的清理动作。如:创建数据库连接、启动服务进程、测试环境的清理或者关系数据库连接等。包括setUp()和tearDown()。

(2)test case(测试用例):通过继承unittest提供的测试基类TestCase创建测试用例,命名规则test_*

(3)test suite(测试集/测试套件):作用就是将一组测试用例归结到一起,一次性执行所有的测试用例。

(4)test runner(测试运行器):一是用来执行测试用例,二是将测试结果提供给用户。

unittest单元测试框架基本结构如下:

from selenium import webdriver  # 从selenium导包webdriver
from time import sleep
import unittest  # 导包unittest(Python中最高级包之一)

class Sample(unittest.TestCase):  # 定义“Sample”的类,继承于unittest.testcase
    def setUp(self):  # 定义方法叫setUp,初始化
        self.driver = webdriver.Chrome()  # 实例化谷歌浏览器赋值给self.driver成员属性,打开浏览器
        self.driver.implicitly_wait(30)  # 元素识别的超时时间为30s
        self.base_url = "http://www.baidu.com/"  # 将被测网站赋值给self.base_url成员属性

    def test_python(self):
        driver = self.driver  # 赋值给局部变量
        driver.get(self.base_url + "/")  # 被测网站+"/"表示根节点,打开网站
        driver.find_element_by_id("kw").send_keys(u"python")
        driver.find_element_by_id("su").click()
        sleep(2)
        self.assertEqual(u"python_百度搜索", driver.title)  # 断言相等。driver.title返回的是字符串
        # AssertEqual属于父类unittest.case的方法

    def tearDown(self):
        self.driver.quit()  # 关闭浏览器,退出进程
           

2.单元测试加载方法:

(1)直接通过unittest.main()方法加载测试模块。

(2)将所有的测试用例添加到测试集中,一次性加载所有的测试对象。

3.TestCase中定义的几个特殊方法:

(1)setUp():测试前初始化工作,每个测试方法运行前运行

(2)tearDown():测试后的清理工作,每个测试方法运行后运行

(3)setUpClass():所有的测试方法运行前运行,必须有@classmethod装饰器进行修饰,只执行一次

(4)tearDownClass():所有的测试方法运行结束后运行,必须有@classmethod装饰器进行修饰,只执行一次

执行顺序:setUpClass→setUp→test_case1→tearDown→tearDownClass

4.常用断言方法

unittest单元测试框架介绍及8种元素定位方法总结

5.页面元素定位方法:

WebDriver中,通常使用find_element_by_(定位单个页面元素)和find_elements_by_(定位多个页面元素)来定位元素。

总共有8种不同的定位方法:id、name、class name、link text、partial link、xpath、css selector、tag name,详细使用方法如下:

unittest单元测试框架介绍及8种元素定位方法总结

注意:定位时需确认该元素是否唯一,若不唯一则需换一种定位方式。

如:

unittest单元测试框架介绍及8种元素定位方法总结

(1)通过id定位:

driver.find_element_by_id(“kw”).send_keys(u"python")

(2)通过name定位:

driver.find_element_by_name(“wd”).send_keys(u"python")

(3)通过class name定位:

driver.find_element_by_class_name(“s_ipt”).send_keys(u"python")

unittest单元测试框架介绍及8种元素定位方法总结

(4)通过link text定位:

driver.find_element_by_link_text(“hao123”).click()

(5)通过partial link定位:

driver.find_element_by_partial_link_text(“hao”).click()

(6)通过tag name定位:

HTML是通过tag来定义功能的,如input是输入,table是表格等。每一个元素本质就是一个tag,但是HTML页面的tag重复性很厉害,一般很少用这个定位。

(7)通过xpath定位:

①绝对路径定位:从html标签开始,一层一层往下写标签,直到这个标签位置(不建议使用,效率不高且冗长)

driver.find_element_by_xpath("/html/body/div[2]/div[2]/div[2]/form/div/div/div[2]/input").send_keys(‘selenium’)

②相对路径定位:以双斜线开始“//”,“//”代表可以从html 中的任何一处开始寻找元素

driver.find_element_by_xpath("//div[@class=‘m-container’]/input").send_keys(‘selenium’)

含义:寻找class='m-container’的div标签下面的input标签

③模糊属性值定位:当一个元素的属性是动态变化的时候,可使用contains或starts-with

driver.find_element_by_xpath("//input[contains(@id,‘er-messa’)]").click()

driver.find_element_by_xpath("//input[starts-with(@id,‘user’)]").click()

④xpath轴定位(Axes):先找一个相对好定位的元素,让它作为轴,根据它和要定位元素间的相对位置进行定位。

unittest单元测试框架介绍及8种元素定位方法总结

⑤文本定位:通过text()函数可以定位到元素文本包含某些关键内容的页面元素

//a[text()=“搜狗搜索”]等同于//a[.=“搜狗搜索”],精准匹配方式,文本内容必须完全匹配

//a[contains(text(),“搜索”]等同于//a[contanins(.=“搜索”)],模糊匹配方式,文本内容部分匹配

//a[contains(text(),“搜索”]/preceding::div等同于//a[contanins(.=“搜索”)]/…,查找元素a的上层父元素div

(8)通过css selector定位:

①绝对路径定位(不推荐):

driver.find_element_by_css_selector(html>body>div>input[value=“查询”])

②相对路径定位:

driver.find_element_by_css_selector(‘input[value=“查询”]’)

③class名称定位:

driver.find_element_by_css_selector(‘input.classvalue’)

#解释:classvalue为class属性的值,用(.)分割元素名与class属性名

④id属性定位:

driver.find_element_by_css_selector(‘input#idvalue’)

#解释:idvalue为id属性的值, 使用“#”分割元素名和id属性的值

⑤其他属性定位:

driver.find_element_by_css_selector(‘img[alt=“div1-img1”]’)

driver.find_element_by_css_selector(‘img[alt=“div1-img1”][href=“https://www.baidu.com”]’)

#可使用多个属性,确保定位元素的唯一性

⑥使用属性值的一部分内容定位:

driver.find_element_by_css_selector(‘a[href ^ =“https//www.bai”]’) #从字符串的开始位置匹配

driver.find_element_by_css_selector(‘a[href $ =“baidu.com”]’) #从字符串的末尾位置匹配

driver.find_element_by_css_selector(‘a[href * =“baidu”]’) #模糊匹配任意字符

⑦通过父元素定位子元素:

driver.find_element_by_css_selector(‘div#idvalue>input#idvalue’)

driver.find_element_by_css_selector(‘div input’)

#解释:符号“>”表示查找父元素div下面的子元素input,也可用空格将父元素子元素隔开

⑧伪类定位元素:

driver.find_element_by_css_selector(‘div#idvalue :first-child’) #注意冒号前有空格

driver.find_element_by_css_selector(‘div#idvalue :nth-child(2)’) #查找某个元素下第二个子页面元素

driver.find_element_by_css_selector(‘div#idvalue :last-child’)

driver.find_element_by_css_selector(‘input :enabled’) #查找可操作的input页面元素

⑨查找同级兄弟页面元素

driver.find_element_by_css_selector(‘div#idvalue > input + a’) #查找div下的input元素后面的同级且临近的a

driver.find_element_by_css_selector(‘div#idvalue > input + * + a’) #查找div下的input和任意一种元素后的同级a

driver.find_element_by_css_selector(‘div#idvalue > p~li’) #查找div下的p元素后面的所有li

⑩多元素选择器

driver.find_element_by_css_selector(‘div#idvalue ,input,a’) #查找input元素,a元素,值为idvalue的div元素

xpath定位与css selector定位比较:

要定位的元素并没有id,name,class属性,或者元素属性值不唯一。那么就可通过xpath或者CSS来定位。

xpath具备更大的灵活性,在XML文档树中的某个节点既可以向前搜索,又可以向后搜索,而css定位只能向前搜索,但xpath的定位速度比css稍慢。

unittest单元测试框架介绍及8种元素定位方法总结

继续阅读