python unittest模块简单使用

发表于:2020-6-17 10:50

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:Java中文社群

  1、fixture-TestCase
  定义的类,必须继承TestCase
  fixture属于执行测试函数的前面以及之后处理的代码块
  类级别
  函数级别
   import unittest
  class Test_01(unittest.TestCase):
  @classmethod
  def setUpClass(cls):
  """
  类级别
  """
  print("类开始")
  def setUp(self):
  """
  函数级别
  """
  print("函数开始")
  def test_01(self):
  print("我是测试test_01模块中的:test_01")
  def test_02(self):
  print("我是测试test_01模块中的:test_02")
  def tearDown(self):
  """
  函数级别
  """
  print("函数结束")
  @classmethod
  def tearDownClass(cls):
  """
  类级别
  """
  print("类结束")
  if __name__ == '__main__':
  unittest.main()
   运行结果:
   类开始
  ..
  函数开始
  我是测试test_01模块中的:test_01
  函数结束
  ----------------------------------------------------------------------
  函数开始
  Ran 2 tests in 0.000s
  OK
  我是测试test_01模块中的:test_02
  函数结束
  类结束
  1
  2、TestSuite-TextTestRunner
  TestSuite(测试套件)用于添加多条测试用例-测试类可以存在不同的文件
  加载指定类中的函数
  加载类中的所有test开头的函数
  TextTestRunner 用于执行测试用例和测试套件
   import unittest
  class T1(unittest.TestCase):
  def test_01(self):
  print("我是T1类中的test_01")
  def test_02(self):
  print("我是T1类中的test_02")
  class T2(unittest.TestCase):
  def test_01(self):
  print("我是T2类中的test_01")
  if __name__ == '__main__':
  suite = unittest.TestSuite()
  # 类名(函数名)--指定加载函数
  suite.addTest(T2("test_01"))
  # 类名--加载类中的所有测试函数
  suite.addTest(unittest.makeSuite(T1))
  runner = unittest.TextTestRunner()
  runner.run(suite)
  运行结果:
    我是T2类中的test_01
  ...
  我是T1类中的test_01
  我是T1类中的test_02
  ----------------------------------------------------------------------
  Ran 3 tests in 0.000s
  OK
  3、TestLoader
  TestLoader 用来添加测试用例,满足条件的用例
  scripts/test_01.py
   import unittest
  class T1(unittest.TestCase):
  def test_01(self):
  print("我是T1类中的test_01")
  def test_02(self):
  print("我是T1类中的test_02")
  class T2(unittest.TestCase):
  def test_01(self):
  print("我是T2类中的test_01")
  main.py
   import unittest
  if __name__ == '__main__':
  # start_dir : 测试用例所在的文件夹
  # pattern:匹配模式,默认 test*.py
  # suite = unittest.TestLoader().discover(start_dir="./scripts", pattern="test*.py")
  suite = unittest.defaultTestLoader.discover(start_dir="./scripts", pattern="test*.py")
  runner = unittest.TextTestRunner()
  runner.run(suite)
  运行结果:
   我是T1类中的test_01
  我是T1类中的test_02
  我是T2类中的test_01
  ...
  ----------------------------------------------------------------------
  Ran 3 tests in 0.000s
  OK
  4、 断言
   import unittest
  class T1(unittest.TestCase):
  def test_01(self):
  # msg 不成立则打印
  self.assertTrue(True, msg="不是True")
  self.assertFalse(False, msg="不是False")
  self.assertEqual(1, 1, msg="两个比较数不相等")
  self.assertNotEqual(1, 2, msg="两个比较数相等")
  self.assertIsNone(None, msg="不为None")
  self.assertIsNotNone("123", msg="为None")
  # 断言"ab" 在"dafjabc"中
  self.assertIn("ab", "dafjabc", msg="在字符串中")
  # 断言"abcd" 不在"dafjabc"中
  self.assertNotIn("abcd", "dafjabc", msg="不字符串中")
  if __name__ == '__main__':
  unittest.main()
  5、参数化-parameterized
  安装模块:pip install parameterized
  使用
   from parameterized import parameterized
  import unittest
  class T1(unittest.TestCase):
  def setUp(self):
  print("函数开始")
  @parameterized.expand([(1, 2, 3), (11, 22, 33), (111, 222, 333)])
  def test(self, a, b, c):
  print(a, b, c)
  if __name__ == '__main__':
  unittest.main()
  结果
   函数开始
  1 2 3
  函数开始
  11 22 33
  函数开始
  111 222 333
  ...
  ----------------------------------------------------------------------
  Ran 3 tests in 0.000s
  OK
  6、 跳过-skip
   import unittest
  class T1(unittest.TestCase):
  temp = 10
  def test(self):
  print("test--->")
  @unittest.skip("暂时不执行该函数")
  def test1(self):
  print("test1--->")
  # True,则跳过,第一个参数bool值,第二个说明
  @unittest.skipIf(temp > 2, "temp大于2时跳过")
  def test2(self):
  print("test2--->")
  # False 跳过
  @unittest.skipUnless(temp > 2, "temp小于2时跳过")
  def test3(self):
  print("test3--->")
  if __name__ == '__main__':
  unittest.main()
  运行结果:
  .ss.
  test--->
  ----------------------------------------------------------------------
  Ran 4 tests in 0.000s
  test3--->
  OK (skipped=2)
  7、 生成HTML报告
  报告下载地址-使用说明
  复制BeautifulReport文件夹到 python安装目录的/site-packages/
  scripts/test_01.py
   import unittest
  class T1(unittest.TestCase):
  def test_01(self):
  print("我是T1类中的test_01")
  def test_02(self):
  print("我是T1类中的test_02")
  class T2(unittest.TestCase):
  def test_01(self):
  print("我是T2类中的test_01")
  1、初次使用
  新建report文件夹
   import unittest
  from BeautifulReport import BeautifulReport
  if __name__ == '__main__':
  suite = unittest.defaultTestLoader.discover(start_dir="./scripts",pattern="test*.py")
  result = BeautifulReport(suite)
  # filename -> 测试报告名称, 如果不指定默认文件名为report.html
  # description -> 测试报告用例名称展示
  # log_path='.' -> log文件写入路径
  result.report(filename="测试报告",description="测试deafult报告",log_path='report')
  运行结果:

  2、添加用例描述-报错的信息点击用例展开即可查看
   import unittest
  import time
  from BeautifulReport import BeautifulReport
  from selenium import webdriver
  class T3(unittest.TestCase):
  def test_01(self):
  """
  我是test_01函数
  """
  print("我是T3中的test_01函数")
  def test_02(self):
  """
  我是test_02函数
  """
  print("我是T3中的test_02函数")
  # 断言失败,信息收集在html的展开中
  self.assertEqual(1,2)
  if __name__ == '__main__':
  suite = unittest.TestSuite()
  suite.addTest(T3("test_01"))
  suite.addTest(T3("test_02"))
  result = BeautifulReport(suite)
  result.report(filename="测试报告",description="测试deafult报告",log_path='report')
  运行结果:

  3、断言失败-自动截图(前提实现save_img函数)
  在当前目录创建img目录存储图片
  当前目录report存储报告
   import unittest
  from selenium import webdriver
  from BeautifulReport import BeautifulReport
  class T3(unittest.TestCase):
  """ 测试T3"""
  def save_img(self, img_name):
  """
  保存图片
  """
  self.driver.get_screenshot_as_file('{}/{}.png'.format("./img", img_name))
  @BeautifulReport.add_test_img('百度首页')
  def test_01(self):
  """
  打开首页, 截图
  """
  self.driver = webdriver.Chrome()
  self.driver.get("http://www.baidu.com")
  # 断言失败
  self.assertEqual(1,2)
  self.driver.quit()
  if __name__ == '__main__':
  suite = unittest.TestSuite()
  suite.addTest(T3("test_01"))
  result = BeautifulReport(suite)
  result.report(filename="测试报告", description="测试deafult报告", log_path='report')
  4、没有断言-需要添加图片-可以在函数中调用save_img
  小Bug,如果只添加一个图片,则会发现测试报告中没有图片(所以在一个测试用例中添加两个图片以上)
   import unittest
  from selenium import webdriver
  from BeautifulReport import BeautifulReport
  class T3(unittest.TestCase):
  def save_img(self, img_name):
  """
  保存图片
  """
  self.driver.get_screenshot_as_file('{}/{}.png'.format("./img", img_name))
  @BeautifulReport.add_test_img('百度首页', "百度首页点击新闻按钮")
  def test_01(self):
  """
  打开首页截图,点击新闻链接截图
  """
  self.driver = webdriver.Chrome()
  self.driver.get("http://www.baidu.com")
  self.save_img('百度首页')
  self.driver.find_element_by_xpath("//*[@id='u1']/a[1]")
  self.save_img('百度首页点击新闻按钮')
  print('跳转与保存截图完成')
  self.driver.quit()
  if __name__ == '__main__':
  suite = unittest.TestSuite()
  suite.addTest(T3("test_01"))
  result = BeautifulReport(suite)
  result.report(filename="测试报告", description="测试deafult报告", log_path='report')


      本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号