1.unittest编写规范
1.unittest介绍
unittest,也可以称为PyUnit,类似于JUnit,用于python项目中,可以用来创建全面的测试套件,可以用于单元自动化测试(模块)、接口自动化测试(接口)、功能自动化测试(UI)等等。
优点:1.支持测试自动化,配置共享和关机代码测试。
2.支持将测试样例聚合到测试集中,并将测试与报告框架独立
官方文档:https://docs.python.org/zh-cn/3.7/library/unittest.html#
unittest具备创建测试用例、测试套件、测试夹具、测试运行期的能力,包括的组件如下:
Test Fixture(测试夹具):表示为了开展一项或多项测试所需要进行的准备工作,以及所有相关的清理操作。举个例子,这可能包含创建临时或代理的数据库、目录,再或者启动一个服务器进程。
Test Case(测试用例):一个测试用例是一个独立的测试单元。它检查输入特定的数据时的响应。
Test Suite(测试套件): 是一系列的测试用例,或测试套件,或两者皆有。它用于归档需要一起执行的测试。
Test Runner(测试运行器):是一个用于执行和输出测试结果的组件。这个运行器可能使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。
2.unittest编写规范
测试模块需要导入unittest框架
测试类必须继承unittest.TestCase;建议以Test开头
测试方法必须以"test_"开头
2.unittest测试框架结构
2.1 setUp()方法
一个测试用例是从setUp()方法开始执行的,用这个方法在每个测试执行前去执行一些初始化的任务。比如创建浏览器实例,访问URL,加载测试数据和打开 日志文件等。此方法没有参数,不返回任何值。当定义一个setUp()方法,测试执行器在每次执行测试方法之前优先执行该方法。
2.2 teardown()方法
类似于setUp()方法在每个测试方法之前被调用,TestCase类也会测试执行完成后调用tearDown()方法来清理所有的初始化值。一旦测试被执行,在setUp()中定义的值将不再需要,所有最好的在完成的时候清理掉。
2.3 setUpClass()方法
必须使用@classmethod装饰器,所有case运行完之后只运行一次
2.4 tearDownClass()方法
必须使用@classmethod装饰器,所有case运行完之后只运行一次
2.5 unittest.skip()装饰器
当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一个常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以使用装饰器屏蔽。
3.unittest基本使用
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep
import unittest
classTestUnit1(unittest.TestCase):defsetUp(self):#1.self 是类的引用/实例#2.全局变量的定义:self.变量名
self.browser = webdriver.Chrome()#self.browser.maxmize_window()
self.url ="https://www.baidu.com/"
self.browser.get(self.url)
sleep(3)#百度搜索信息#测试用例命名:test_deftest_search1(self):
self.browser.find_element(By.ID,value="kw").send_keys("接口测试")
self.browser.find_element(By.ID,value="su").click()
sleep(3)deftest_search2(self):
self.browser.find_element(By.ID,value="kw").send_keys("性能测试")
self.browser.find_element(By.ID,value="su").click()
sleep(3)deftearDown(self):
self.browser.quit()if __name__ =="__main__":
unittest.main()
4.测试套件
把不同文件下的测试用例组织起来形成的测试用例组。
把需要一次性执行的测试用例,放在一个套件中,就可以一次性运行。
```python
import unittest
from Test import demo1
defcreatSuit():"""
1.不同测试脚本的类中需要执行的方法在一个测试套件中
suit = unittest.TestSuit()
suit.addTest(demo1.TestUnit1("test_search1"))
""""""
2.将一个测试类中的所有方法进行添加
makeSuite("类名")
suit.addTest(unittest.makeSuite("TestUnit1"))
""""""
"""3.discover批量加载文件夹用例
discover(case_dir,pattern,top_level_dir)@case_dir:待执行用例的目录
@pattern:匹配脚本名称的规则
@top_level_dir:顶层目录的名称,一般默认None就行
"""
discover = unittest.defaultTestLoader.discover("./Test",pattern="demo*.py",top_level_dir=None)return discover
if __name__=="__main__":
suit = creatSuit()
runner = unittest.TextTestRunner()
runner.run(suit)
3.1 测试用例执行顺序
按照test_后面的名称排序,0 ~ 9, A ~ Z,a ~ z。如果第一个字母相同,就看第二个字母,依次执行。
3.2 忽略测试用例的执行
@unittest.skip(“skipping”)
@unittest.skip(reason)
跳过被此装饰器装饰的测试。 reason 为测试被跳过的原因。
@unittest.skipIf(condition, reason)
当 condition 为真时,跳过被装饰的测试。
@unittest.skipUnless(condition, reason)
跳过被装饰的测试,除非 condition 为真。
@unittest.expectedFailure
把测试标记为预计失败。如果测试不通过,会被认为测试成功;如果测试通过了,则被认为是测试失败。
exception unittest.SkipTest(reason)
引发此异常以跳过一个测试。通常来说,你可以使用 TestCase.skipTest() 或其中一个跳过测试的装饰器实现跳过测试的功能,而不是直接引发此异常。
被跳过的测试的 setUp() 和 tearDown() 不会被运行。被跳过的类的 setUpClass() 和 tearDownClass() 不会被运行。被跳过的模组的 setUpModule() 和 tearDownModule() 不会被运行。
4.断言
在自动化脚本中来判断实际结果和预期结果是否一致情况。
就百度为例,如何判断查询成功?网页标题是搜索信息,或者页面中出现某个元素。
assertEqual(预期结果,实际结果,msg = “实际结果于预期结果不一致时输出的内容”)。
MethodChecks thatassertEqual(a, b)a == bassertNotEqual(a, b)a != bassertTrue(x)bool(x) is TrueassertFalse(x)bool(x) is FalseassertIsNot(a, b)a is bassertEqual(a, b)a is not bassertIsNone(x)x is NoneassertIsNotNone(x)x is not NoneassertIn(a, b)a in bassertNotIn(a, b)a not in bassertIsInstance(a, b)isinstance(a, b)assertNotIsInstance(a, b)not isinstance(a, b)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from time import sleep
import unittest
classTestBaidu(unittest.TestCase):defsetUp(self):
self.driver = webdriver.Chrome()
self.url ="https://www.baidu.com/"
self.driver.get(self.url)
sleep(2)deftest_baidu1(self):
self.assertTrue("百度一下,你就知道"== self.driver.title, msg="不一致!!!")
self.driver.find_element(By.ID,"kw").send_keys("selenium")
self.driver.find_element(By.ID,"su").submit()
sleep(3)print(self.driver.title)
self.assertEqual(self.driver.title,"selenium_百度搜索", msg="实际结果和预期结果不一致")
sleep(3)deftearDown(self):
self.driver.quit()if __name__=="__main__":
unittest.main()
版权归原作者 九巷_ 所有, 如有侵权,请联系我们删除。