在了解了ui自动化的方法后,实际应用时需要按照测试用例的形式来书写,否则执行起来太过冗余,这里引入一个测试框架:unittest,使用这个框架中编写用例,会更方便管理和运行。
一、unitest基础写法格式
1.1引用导入
import unittest
并且需要新建一个类,继承unittest
class Demo(unittest.TestCase):
1.2格式代码示例
备注:
1.用例的方法名中,要以test开头才能被读取出来
2.用例的读取顺序按照方法名的ASCII码顺序运行,顺序:0-9,A-Z,a-z
# -*- coding:utf-8 -*-
import unittest
class Demo(unittest.TestCase):
def setUp(self):
print("测试开始")
def test_01(self):
print("第一条用例")
def tearDown(self):
print("测试结束")
if __name__ == '__main__':
unittest.main()
二、常用方法、装饰器详解
2.1 unittest中常用方法、装饰器
运行该模块中的测试用例方法
unittest.main()
装饰器:跳过该方法
@unittest.skip
装饰器: 满足条件时,跳过该方法
@skipIf(condition, reason)
- condition:判断条件
- reason:原因描述
装饰器:不满足条件时,跳过该方法
@skipUnless(condition, reason)
- condition:判断条件
- reason:原因描述
2.2 TestCase中常用方法
每条用例方法执行前,运行此方法
setUp()
每条用例方法执行后,运行此方法
tearDown()
该类下所有测试用例执行前,运行此方法
@classmethod
def setUpClass()
该类下所有测试用例执行后,运行此方法
@classmethod
def tearDownClass()
跳过执行测试用例
skipTest(reason)
reason:跳过测试的原因
注:该方法可以放在测试用例中执行,此时此用例中该方法后的代码不执行
如果放在setUp()中使用,则该类下的所有测试方法都不执行
三、实例展示:使用unittest运行UI测试用例
这里我们把15、16节中的元素等待、使用js语句这两个例子,作为两个测试用例,另外两个用例,一个使用装饰器跳过、另一个使用不规范的方法命名,期望结果TestCase会加载三个用例,只运行其中两个。
# -*- coding:utf-8 -*-
from selenium import webdriver
import unittest
class PcLogin(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("所有测试开始")
def setUp(self):
print("测试开始")
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(10)
self.driver.set_page_load_timeout(15)
@unittest.skip
def test_02(self):
"""使用装饰器跳过此方法"""
print("第二条用例")
def demo_04(self):
"""方法命名不规范,不会运行此方法"""
print("demo")
def test_03_js(self):
"""使用js高亮显示元素"""
print("第三条用例")
self.driver.get("http://www.runoob.com/js/js-tutorial.html")
# 高亮显示所定位的元素
light_element = self.driver.find_element_by_id("s")
js_sentence_light = "arguments[0].setAttribute('style', arguments[1]);"
js_sentence_args = "color: yellow; border: 5px solid yellow;"
self.driver.execute_script(js_sentence_light, light_element, js_sentence_args)
def test_01_register(self):
"""百度注册页面"""
print("第一条用例")
self.driver.get("https://passport.baidu.com/v2/?login")
# 点击注册
self.driver.find_element("xpath", "//a[text()='立即注册']").click()
# 切换页签
all_handle = self.driver.window_handles
self.driver.switch_to.window(all_handle[1])
# 定位标签
self.driver.find_element("xpath", "//label[text()='用户名']/following-sibling::input[last()]").send_keys("用户西城")
self.driver.find_element("xpath", "//label[text()='手机号']/following-sibling::input[last()]").send_keys("18888888888")
self.driver.find_element("xpath", "//label[text()='密码']/following-sibling::input[last()]").send_keys("U1sd23456")
def tearDown(self):
print("测试完成")
self.driver.quit()
@classmethod
def tearDownClass(cls):
print("所有测试结束")
if __name__ == '__main__':
unittest.main()
运行结果:
所有测试开始
测试开始
第一条用例
测试完成
测试开始
.测试完成
测试开始
.第三条用例
测试完成
所有测试结束
.
----------------------------------------------------------------------
Ran 3 tests in 31.747s
OK