• Python + UnitTest 软件测试流程总结


    以测试用户登录流程为例:

    TestCase:

    TestCase 主要用来编写测试用例,这里结合 断言(assertEqual 和 assertIn) 进行判断,避免了手动书写判断。

    1. # tools.py
    2. # 登录验证方法
    3. def login(username, password):
    4. if username == 'admin' and password == '123456':
    5. return '登录成功'
    6. else:
    7. return '登录失败'
    1. # TestCase.py
    2. # 导入 unittest
    3. import unittest
    4. from tools import login
    5. class TestLogin(unittest.TestCase):
    6. def test_username_password_ok(self):
    7. self.assertEqual('登录成功', login('admin', '123456'))
    8. def test_username_error(self):
    9. self.assertEqual('登录失败', login('root', '123456'))
    10. def test_password_error(self):
    11. self.assertEqual('登录失败', login('admin', '123123'))
    12. def test_username_password_error(self):
    13. # self.assertEqual('登录失败', login('root', '123123'))
    14. self.assertIn('失败', login('aaa', '123123')) # 结果中包含“失败”即可

    TestSuite:

    TestSuite 用来管理多个 TestCase 文件,使用 unittest.TestSuite() 实例化套件对象,再使用套件对象添加用例方法。

    假如创建多个 TestCase 文件:

    1. # testCase1.py
    2. # 导包
    3. import unittest
    4. # 自定义测试类,继承 unittest 类中 testCase 类
    5. class testDemo1(unittest.TestCase):
    6. # 测试方法(用例代码)
    7. def method1(self):
    8. print('测试方法1-1')
    9. def method2(self):
    10. print('测试方法1-2')
    1. # testCase2.py
    2. # 导包
    3. import unittest
    4. # 自定义测试类,继承 unittest 类中 testCase 类
    5. class testDemo2(unittest.TestCase):
    6. # 测试方法(用例代码)
    7. def method1(self):
    8. print('测试方法2-1')
    9. def method2(self):
    10. print('测试方法2-2')

    TestRunner:

    用来执行对象。

    1. # TestSuite_Runner.py
    2. # TestSuite用来管理多个TestCase文件
    3. # 1.导包
    4. import unittest
    5. # 2.实例化(创建对象)套件对象
    6. from testCase1 import testDemo1
    7. from testCase2 import testDemo2
    8. from TestCase import TestLogin
    9. suite = unittest.TestSuite()
    10. # 3.使用套件对象添加用例方法
    11. # 方法一:套件对象.addTest(测试类名('方法名'))
    12. suite.addTest(testDemo1('method1'))
    13. suite.addTest(testDemo1('method2'))
    14. suite.addTest(testDemo2('method1'))
    15. suite.addTest(testDemo2('method2'))
    16. # 方法二:将一个测试类中的所有方法进行添加
    17. # 套件对象.addTest(unittest.makeSuite(测试类名))
    18. suite.addTest(unittest.makeSuite(testDemo1))
    19. suite.addTest(unittest.makeSuite(testDemo2))
    20. suite.addTest(unittest.makeSuite(TestLogin))
    21. # 4.实例化运行对象
    22. runner = unittest.TextTestRunner()
    23. # 5.使用运行对象去执行套件对象
    24. # 运行对象.run(套件对象)
    25. runner.run(suite)

    TestLoader:

    用于多个 TestCase 中有多个 Method 时,写法较简便

    1. # TestLoader.py
    2. # 1.导包
    3. import unittest
    4. # 2.实例化加载对象并添加用例
    5. # unittest.TestLoader().discover('用例所在的路径', '用例的代码文件名')
    6. suite = unittest.TestLoader().discover('./case', '*.py')
    7. # suite = unittest.defaultTestLoader().discover('./case', '*.py') 两种写法
    8. # 将3.4.合并
    9. unittest.TextTestRunner().run(suite)

    TestFixture:

    在执行每个测试方法的前后会出现一些重复操作,可以使用 TestFixture 进行书写。

    1. # TestFixture.py
    2. import unittest
    3. class TestLogin(unittest.TestCase):
    4. # 1.打开浏览器(整个测试过程中就打开一次浏览器) 类级别
    5. @classmethod
    6. def setUpClass(cls) -> None:
    7. print('打开浏览器')
    8. # 2.输入网址(每个测试方法都需要一次) 方法级别
    9. def setUp(self):
    10. # 每个测试方法执行之前都会调用的方法
    11. print('输入网址')
    12. # 3.输入用户名密码验证码点击登录(不同的测试数据) 测试方法
    13. def test_1(self):
    14. print('输入正确信息,点击登录1')
    15. def test_2(self):
    16. print('输入错误信息,点击登录2')
    17. # 4.关闭当前页面(每个测试方法都需要一次) 方法级别
    18. def tearDown(self):
    19. # 每个测试方法执行之后都会调用的方法
    20. print('关闭当前页面')
    21. # 5.关闭浏览器(整个测试过程中就关闭一次浏览器) 类级别
    22. @classmethod
    23. def tearDownClass(cls) -> None:
    24. print('关闭浏览器')

    Skip:

    不想执行某个测试用例时,可以进行直接跳过(skip)或者条件触发(skipIf)跳过。

    1. # skip.py
    2. # 导包
    3. import unittest
    4. version = 30
    5. # 自定义测试类
    6. class testDemo(unittest.TestCase):
    7. # 测试方法
    8. @unittest.skip('直接跳过')
    9. def test_method1(self):
    10. print('测试方法111')
    11. @unittest.skipIf(version >= 30, '版本高跳过测试')
    12. def test_method2(self):
    13. print('测试方法222')
    14. def test_method3(self):
    15. print('测试方法333')
    16. # 执行用例(方法)

    Parameterized:

    在实际开发中,测试用例的数据不能写死,这时用到json文件的读取,之后利用 parameterized 对读取函数进行调用。

    首先执行 pip install parameterized 下载;

    之后在模块中导入 from parameterized import parameterized

    1. # 导入unittest/parameterized
    2. import json
    3. import unittest
    4. from parameterized import parameterized
    5. from tools import login
    6. # 组织测试数据
    7. def build_data():
    8. with open('data.json', encoding='utf-8') as f:
    9. result = json.load(f)
    10. data = []
    11. for info in result:
    12. data.append((info.get('username'), info.get('password'), info.get('expect')))
    13. return data
    14. # 定义测试类
    15. class TestLogin(unittest.TestCase):
    16. # 书写测试方法(用到的测试数据使用变量代替)
    17. @parameterized.expand(build_data())
    18. def test_login(self, username, password, expect):
    19. self.assertEqual(expect, login(username, password))

     这里的 data.json:

    1. [
    2. {
    3. "desc": "正确用户名密码",
    4. "username": "admin",
    5. "password": "123456",
    6. "expect":"登录成功"
    7. },
    8. {
    9. "desc": "错误用户名",
    10. "username": "root",
    11. "password": "123456",
    12. "expect":"登录失败"
    13. },
    14. {
    15. "desc": "错误密码",
    16. "username": "admin",
    17. "password": "123123",
    18. "expect":"登录失败"
    19. }
    20. ]

    在此过程中会生成测试报告,在终端中执行代码后,按照以下步骤可以进行查看:

     

     

    运行html文件即可,效果如图:

    这样生成的测试报告相对简陋,可以使用第三方库生成,在当前目录中放入顶部的两个文件。

    接下来书写以下代码:

    1. # 利用第三方生成测试报告
    2. # 中文版
    3. # 1.获取第三方的 测试运行类模块,将其放在代码的目录中
    4. # 2.导包 unittest
    5. import unittest
    6. from HTMLTestRunnerCN import HTMLTestReportCN
    7. # 3.使用 套件对象,加载对象 去添加用例方法
    8. suite = unittest.defaultTestLoader.discover('.', 'pa*login.py')
    9. # 4.实例化 第三方的运行对象
    10. file = 'report_cn.html'
    11. with open(file, 'wb') as f:
    12. # 运行对象(第二个参数是:是否详细 1/2,第三个参数是报告标题,第三个参数是python/pycharm版本)
    13. runner = HTMLTestReportCN(f, 2, '测试报告中文版', 'python 3.6.7')
    14. # 5.运行 套件对象
    15. runner.run(suite)
    16. # --------------------上下两端代码不要一起执行------------------------
    17. # 1.获取第三方的 测试运行类模块,将其放在代码的目录中
    18. # 2.导包 unittest
    19. import unittest
    20. # 英文版
    21. from HTMLTestRunner import HTMLTestRunner
    22. # 3.使用 套件对象,加载对象 去添加用例方法
    23. suite = unittest.defaultTestLoader.discover('.', 'pa*login.py')
    24. # 4.实例化 第三方的运行对象
    25. file = 'report.html'
    26. with open(file, 'wb') as f:
    27. # 运行对象
    28. runner = HTMLTestRunner(f, 1, '测试报告', 'python 3.6.8')
    29. # 5.运行 套件对象
    30. runner.run(suite)

    效果如下: 

     

  • 相关阅读:
    SpringMVC------JavaEE(实现前后端交互)
    Python高级学习笔记(一)—— 多任务编程
    Oracle SQL执行计划操作(10)——聚合及分析函数相关操作
    IDEA中Run/Debug Configurations添加VM options和Program arguments
    抖音的文案怎么做|成都聚华祥
    Flink学习10:使用idea编写WordCount,并打包
    计算机微信小程序毕业设计题目SSM投票系统+后台管理系统|前后分离VUE问卷调查[包运行成功]
    电脑商城系统
    样本对应模型例题
    VulnHub — Me-and-My-Girlfriend-1
  • 原文地址:https://blog.csdn.net/XZZXBC/article/details/134332357