练习01
- 创建⼀个⽬录 case, 作⽤就是⽤来存放⽤例脚本,
- 在这个⽬录中创建 5 个⽤例代码⽂件 , test_case1.py
- 使⽤ TestLoader 去执⾏⽤例
将来的代码 ⽤例都是单独的⽬录中存放的
test_项⽬_模块_功能.py
test_case1.py
# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法1')
test_case2.py
# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法2')
test_case3.py
# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法3')
test_case4.py
# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法4')
test_case5.py
# 1. 导包 unittest
import unittest
# 2. 定义测试类, 只要继承 unittest.TestCase 类, 就是测试类
class TestDemo(unittest.TestCase):
#3.书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test_metho(self):print('测试方法5')
hm_05_test.py
# 1. 导包 unittest
import unittest
# 2. 实例化套件对象 unittest.TestSuite()
suite = unittest.TestLoader().discover('case', 'test*.py')
# 3.实例化执行对象并执行
unittest.TextTestRunner().run(suite)
TestLoader()
链接: http://t.csdnimg.cn/lLkts
练习02
定义⼀个 tools 模块, 在这个模块中 定义 add 的⽅法,可
以对两个数字求和,返回求和结果书写⽤例, 对 add() 函数进⾏测试 1, 1, 2 1, 2, 3 3, 4, 7 4, 5, 9
之前的测试⽅法,直接⼀个 print 这个案例中的 测试⽅法,调⽤ add 函数, 使⽤ if 判断,来判断 预期结果和实际结果是否相符 预期结果 2 3 7 9 实际结果 调⽤ add()
hm_06_test_add.py
# 1. 导包 unittest
import unittestfrom tools import add# 2. 定义测试类, 只要继承 unittest.TestCase 类
class TestAdd(unittest.TestCase):#3.书写测试方法def test_1(self):"""1,1,2"""if 2 == add(1, 1):print(f'用例 {1}, {1}, {2}通过')else:print(f'用例 {1}, {1}, {2}不通过')def test_2(self):if 3 == add(1, 2):print(f'用例 {1}, {2}, {3}通过')else:print(f'用例 {1}, {2}, {3}不通过')def test_3(self):if 7 == add(3, 4):print(f'用例 {3}, {4}, {7}通过')else:print(f'用例 {3}, {4}, {7}不通过')def test_4(self):if 9 == add(4, 5):print(f'用例 {4}, {5}, {9}通过')else:print(f'用例 {4}, {5}, {9}不通过')
hm_07_add.py
# 套件和执行
# 1. 导包 unittest
import unittestfrom hm_06_test_add import TestAdd
# 2. 实例化套件对象 unittest.TestSuite()
suite = unittest.TestSuite()
# 将 TestAdd 类中的所有测试方法添加到测试套件中
suite.addTest(unittest.makeSuite(TestAdd))
# 使用 TextTestRunner 运行测试套件中的所有测试用例,并将结果输出到标准输出(控制台)
unittest.TextTestRunner().run(suite)
当我们分解这行代码时,我们可以看到它包含了几个关键部分:
-
unittest.makeSuite(TestAdd)
: 这部分调用了unittest
模块中的makeSuite
函数,它的作用是创建一个测试套件(TestSuite)。makeSuite
函数接受一个测试类作为参数,并自动收集该类中所有以test
开头的测试方法,并将它们添加到测试套件中。 -
TestAdd
: 这部分是一个测试类的名称,表示我们要将哪个测试类中的测试方法添加到测试套件中。在这个例子中,TestAdd
是一个自定义的测试类。 -
suite.addTest(...)
: 这部分是将测试用例(test case)添加到测试套件中的方法。addTest
方法接受一个测试用例对象作为参数,并将其添加到测试套件中。在这个例子中,makeSuite(TestAdd)
返回了一个包含TestAdd
类中所有测试方法的测试套件,然后我们通过addTest
方法将这个测试套件添加到另一个测试套件中。
综上所述,suite.addTest(unittest.makeSuite(TestAdd))
这行代码的作用是将 TestAdd
类中的所有测试方法添加到一个测试套件中。
htools.py
#函数的调用
def add(a, b):return a + b
Fixture
⽅法级别 Fixture
在每个⽤例执⾏前后都会⾃动调⽤, ⽅法名是固定的
def setUp(self): # 前置# 每个⽤例执⾏之前都会⾃动调⽤pass
def tearDown(self): # 后置# 每个⽤例执⾏之后 都会⾃动调⽤pass
# ⽅法前置 ⽤例 ⽅法后置
# ⽅法前置 ⽤例 ⽅法后置
类级别 Fixture
在类中所有的测试⽅法执⾏前后 会⾃动执⾏的代码, 只执⾏⼀次
# 类级别的 Fixture 需要写作类⽅法
@classmethod
def setUpClass(cls): # 类前置pass
@classmethod
def tearDownClass(cls): # 后置pass
模块级别Fixture(了解)
模块, 就是代码⽂件
模块级别 在这个代码⽂件执⾏前后执⾏⼀次
# 在类外部定义函数
def setUpModule():pass
def tearDownModule():pass
Fixture实现
tpshop 登录
- 打开浏览器 (⼀次)
- 打开⽹⻚,点击登录 (每次)
- 输⼊⽤户名密码验证码1,点击登录 (每次, 测试⽅法)
- 关闭⻚⾯ (每次)
- 打开⽹⻚,点击登录 (每次)
- 输⼊⽤户名密码验证码2,点击登录 (每次, 测试⽅法)
- 关闭⻚⾯ (每次)
- 打开⽹⻚,点击登录 (每次)
- 输⼊⽤户名密码验证码3,点击登录 (每次, 测试⽅法)
- 关闭⻚⾯ (每次)
- 关闭浏览器 (⼀次)
import unittest
class TestLogin(unittest.TestCase):def setUp(self) -> None:print('2. 打开⽹⻚, 点击登录')def tearDown(self) -> None:print('4. 关闭⽹⻚')@classmethoddef setUpClass(cls) -> None:print('1. 打开浏览器')@classmethoddef tearDownClass(cls) -> None:print('5. 关闭浏览器')def test_1(self):print('3. 输⼊⽤户名密码验证码1,点击登录 ')def test_2(self):print('3. 输⼊⽤户名密码验证码2,点击登录 ')def test_3(self):print('3. 输⼊⽤户名密码验证码3,点击登录 ')