接口自动化--UnitTest框架09


unit_demo.py

'''
UnitTest测试框架应用:
  1. 类名继承unittest.TestCase
  2. 测试用例:所有的测试用例,都是以函数的形式存在,函数的名称必须以test开头
  3. 用例加载顺序:UnitTest中有默认的用例加载顺序:0-9,A-Z,a-z
  4. 所有的前置后置都有等级存在:class级别,method级别;潜质与后置函数有且只有一个
  method级别前置后置:
    与用例关联,每一条用例运行前会执行前置,运行后会执行后置
  class级别前置后置:
    1. 必须定义装饰器@classmethod
    2. 前置是在所有内容运行前运行一次,后置是所有内容运行结束后运行一次
  5. cls对象只在class级别前后置中进行定义,而调用则还是通过self进行调用
  6. 修改cls对象的值,在全局生效,需要通过类名.对象进行赋值操作才可以生效,而通过self.对象进行赋值只能够在当下函数中生效
'''
# 导入UnitTest模块
import unittest
from time import sleep
from selenium import webdriver


# 如何真正意义上应用UnitTest 框架:必须在类名继承unittest.TestCase
class UnitDemo(unittest.TestCase):
  # class级别前置:比如说,所有的配置
  # @classmethod
  # def setUpClass(cls) -> None:
  # cls.driver = webdriver.Chrome()
  # cls.driver.get('http://www.baidu.com')
  # cls.title = None
  # cls.DD = '你好'

  # class级别后置
  # @classmethod
  # def tearDownClass(cls) -> None:
  # # 用例2的值
  # print(cls.title)
  # cls.driver.quit()

  # 前置条件:method级别
  # def setUp(self) -> None:
  # self.driver = webdriver.Chrome()
  # self.driver.get('http://www.baidu.com')

  # 后置条件:method级别
  # def tearDown(self) -> None:
  # self.driver.quit()

  # 测试用例:所有的测试用例,都是以函数的形式存在,函数的名称必须以test开头
  # def test_search01(self):
  # input_ = self.driver.find_element_by_name('wd')
  # input_.clear()
  # input_.send_keys(self.DD)
  # button = self.driver.find_element_by_id('su')
  # button.click()
  # sleep(3)
  # print(self.title) // 目前数值为None
  # 修改cls.title的值,需要采用(类名.对象)在全局生效。
  # UnitDemo.title = self.driver.title
  # print(self.title)
  # self.assertEqual('123','123',msg='断言失败')

  # def test_search02(self):
  # input_ = self.driver.find_element_by_name('wd')
  # input_.clear()
  # input_.send_keys('迪丽热嫣')
  # button = self.driver.find_element_by_id('su')
  # button.click()
  # sleep(3)
  # # 用例1的值
  # print(self.title)
  # UnitDemo.title = self.driver.title
  # print(self.title)

  # 普通函数:封装逻辑代码,以便于在测试用例中进行调用
  def test_login(self):
  print('这是login函数')
  # assert '123' == '1231','断言失败'
  self.assertEqual('123', '123', msg='断言失败')
  # 3.11111111111111111与3.11111111111111112
  # self.assertAlmostEqual(3.11, 3.12, msg='失败')
  # 当一个变量为空或者None或者False的时候,从布尔值的角度考虑都属于False
  # self.assertTrue(a, msg='失败')


# 要运行测试用例
if __name__ == '__main__':
  # UnitTest执行测试用例的行为
  unittest.main()

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

unit_skip_demo.py

'''
  Skip装饰器,通过@unittest.skip进行调用
  总计有四种不同的skip装饰器:
    1. @unittest.skip():无条件跳过该用例执行
    2. @unittest.skipif():当if条件为真时,跳过
    3. @unittest.skipUnless():与skipif相反,当条件为假的时候,跳过
    4. @unittest.expectedFailure:当用例报错时,系统选择忽略
'''

class Demo(unittest.TestCase):
  @unittest.skipIf(1 == 1, '1 == 1 的条件为真时跳过')
  def test_2(self):
  print('test 2')

  @unittest.skip('无条件跳过该用例执行')
  def test_1(self):
  print('test 1')

  @unittest.skipUnless(1 == 2, '1 == 2 的条件为假时跳过')
  def test_3(self):
  print('test 3')

  @unittest.expectedFailure
  def test_4(self):
  a = 1 / 0
  print('test 4')


if __name__ == '__main__':
  unittest.main()

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

suite_dmeo.py
'''

UnitTest中一大特色:测试套件与测试运行器
测试套件:可以理解为一个list集合
默认在框架中所有的用例都会全部执行,且是依照UnitTest的规则来进行排序执行的
例如:
冒烟测试
针对特定流程来执行测试
应用一定是结合UnitTest测试框架来执行的
套件的运行是一定需要通过运行器来进行运行操作,默认的运行器TextTestRunner
运行套件时,用例的顺序是基于套件在添加用例时的顺序来定的。
测试运行器:支持外部的第三方运行器,比如HTMLTestRunner
HTML模块无法通过pip进行安装,本身是针对2版本的python来进行实现的
'''

导入包
import os
import unittest
from HTMLTestRunner import HTMLTestRunner
from HTMLTestReportCN import HTMLTestRunner

# 添加用例到套件执行
# 创建套件
suite = unittest.TestSuite()
# 1.添加用例到套件中:添加单个测试用例,通过用例的名称进行添加
# suite.addTest(Demo('test_3'))
# suite.addTest(Demo('test_2'))
# suite.addTest(Demo('test_4'))
# 2.批量添加用例到套件:一次性添加多个测试用例,通过用例集合来进行添加
# cases = [Demo('test_3'), Demo('test_2'), Demo('test_1')]
# suite.addTests(cases)
# 3.批量添加测试用例:通过TestCase对象直接添加一整个UnitTest类
# suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Demo))
# 4. 批量添加:通过类名来进行添加
# suite.addTests(unittest.TestLoader().loadTestsFromName('unit_skip_demo.Demo'))
# 5. 批量添加:通过文件名来进行添加
# 定义获取用例的路径
case_dir = '../'
# 基于路径的用例,组合成套件
discover = unittest.defaultTestLoader.discover(start_dir=case_dir, pattern='u*.py')

# 运行套件
# runner = unittest.TextTestRunner()
# runner.run(discover)


# 运行HTMLTestRunner生成测试报告
# 保存路径
report_path = './report/'
# 报告的文件名称
report_file = report_path + 'report3.html'
# 判断保存路径是否存在
if not os.path.exists(report_path):
os.mkdir(report_path)
with open(report_file, 'wb') as file:
runner = HTMLTestRunner(stream=file, title='这是第一份测试报告',
description='这是测试报告的描述', tester='wbn')
runner.run(discover)