Python从2.1开始将unittest内置为标准库,方便对程序进行测试、验证,我们对unittest进行学习:
本章的单元测试格式如下:新建一个单元测试的例子本章知识点如下:
1、该测试类需要继承unittest.TestCase
2、结构为:
a、setUp方法测试前准备工作
b、tearDown方法测试后收尾工作
c、测试用例,以test_add(),以test开头,实例化需要的测试类,测试对应函数,self.assertEqual(result, 8)断言测试结果
d、创建测试套件suite,unittest.TestSuite()
e、将测试用例添加到测试套件中,suite.addTest(TestCalculator("test_add"))
f、获取runner,这里用TextTestRunner,直接输出到控制台,unittest.TextTestRunner()
g、运行测试用例,runner.run(suite)
3、断言的几个方法:
assertEqual(a, b): a == b
assertNotEqual(a, b): a != b
assertTrue(x): bool(x) is True
assertFalse(x): bool(x) is False
assertIs(a, b): a is b
assertIsNot(a, b): a is not b
assertIsNone(x): x is None
assertIsNotNone(x): x is not None
assertIn(a, b): a in b
assertNotIn(a, b): a not in b
assertIsInstance(a, b): isinstance(a, b) 判断a是否是b的实例
assertNotIsInstance(a, b): not isinstance(a, b) 判断a是否不是b的实例
4、测试用例的规范设计:
项目中:test_case文件夹:
test_calculator.py
test_leapyear.py
calculator.py
leap_year.py
run_test.py
一个测试项目,需要一个test_case测试用例文件夹,里面存放测试用例,被测功能一般在外面,这里没有再做处理,
通过定义run_test.py,创建一个suit = unittest.defaultTestLoader.discover(test_dir, pattern),
该套件会主导在指定目录下查找测试用例,从而达到简便执行所有指定测试用例
(不同到功能测试用例存放在不同的py文件中,规范格式)
5、测试用例执行顺序:
unittest默认根据ASCII码的顺序加载测试用例的(数字与字母的顺序为0~9,A~Z,a~z),并不是按照测试用例的创建
顺序从上往下执行的
另外一种通过声明TestSuite类,addTest()方法按照一定顺序来加载测试用例也可以实现顺序自定义
6、执行多级目录的测试用例:
让unittest查找test_case目录下子目录中的测试文件,可以中每个子目录下放一个__init__.py文件,将一个目录标记成
一个标准的Python模块
7、跳过测试用例和预期失败:
(利用装饰器实现:在用例前添加@unittest.skip("直接跳过测试用例"))
a、无条件跳过测试用例:unittest.skip("直接跳过测试用例")
b、如果条件为真,则跳过该测试用例:unittest.skipIf(3 > 2, "当条件为真时跳过")
c、如果条件为真时,执行该测试用例:unittest.skipUnless(3 > 2, "条件为真时执行该测试用例")
d、直接将该测试用例标记为Fail:unittest.expectedFailure()
8、Fixture:
setUpModule()/tearDownModule():整个模块开始与结束时执行
setUpClass(cls)/tearDownClass(cls):测试类开始和结束时执行
(setUpClass(cls)/tearDownClass(cls),属于类方法,需要通过@classmethod进行装饰,cls和self没什么区别,都表示方法的第一个参数)
setUp(self)/tearDown(self):测试用例开始和结束时执行
9、编写简易自动化测试:
如test_baidu.py,注意其结构:
# coding = utf8
import os
os.path.abspath(".")
import unittest
from selenium import webdriver
from time import sleep
class TestBaidu(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.base_url = "百度一下,你就知道"
# 根据不同内容搜索
def baidu_search(self, search_keys):
self.driver.get(self.base_url)
sleep(2)
self.driver.find_element_by_id("kw").send_keys(search_keys)
self.driver.find_element_by_id("su").click()
sleep(2)
def test_search_keys_selenium(self):
search_keys = "selenium"
self.baidu_search(search_keys)
self.assertEqual(self.driver.title, search_keys + "_百度搜索")
print(self.driver.title)
def test_search_keys_appium(self):
search_keys = "appium"
self.baidu_search(search_keys)
self.assertEqual(self.driver.title, search_keys + "_百度搜索")
@classmethod
def tearDownClass(cls):
cls.driver.quit()
接下来附上文件:unittest_samplepan.baidu.com
通过run_test.py运行测试用例:
对所有的test规范格式的测试用例进行run,使用HTMLTestRunner整理获得测试报告,输出至网页中,每一条都清晰可见
run_test.py
# coding = utf8
import os
os.path.abspath(".")
import unittest
import HtmlTestRunner
test_dir = "./unittest_sample/test_case"
suit = unittest.defaultTestLoader.discover(test_dir, pattern = "test*.py")
runner = HtmlTestRunner.HTMLTestRunner("./unittest_sample/report/report.html")
runner.run(suit)下一章,我们对unittest进行一个扩展,当前就先到这里啦!
关注 + 收藏 + 点赞哦,谢谢啦~