51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 844|回复: 0
打印 上一主题 下一主题

[原创] 浅谈unittest单元测试框架

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-11-8 16:24:30 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 草帽路飞UU 于 2022-11-11 16:16 编辑

摘要:单元测试对于软件测试人员来说是个“高端”的技能,甚至有一些开发人员也会写单元测试。然而,我 们已经学会了开发Web系统,那么,顺带着来讨论一下Django的单元测试。

  unittest单元测试框架


  在学习Django单元测试之前,我们先来学习一下 unittest单元测试框架。首先,更新一个误区,单元测 试框架不只适用于程序单元级别的测试。

  一般单元测试框架主要完成以下几件事儿:


  提供用例组织与执行:当你的测试用例只有几条时,可以不必考虑用例的组织,但是,当测试用例达到 成百上千条时,大量的测试用例堆砌在一起,就产生了扩展性与维护性等问题,需要考虑用例的规范



与组织 问题了。单元测试框架就是用来解决这个问题的。

  提供丰富的比较方法:不论是功能测试,还是单元测试,在用例执行完成之后都需要将实际结果与进行 预期结果的进行比较(断言),从而断定用例是否执行通过。所以,作为单元测试框架一般也会提供



丰富的 断言方法。例如,判断相等/不等、包含/不包含、Trure/False 的断言方法等。

  提供丰富的日志:当测试用例执行失败时能抛出清晰的失败原因,当所有用例执行完成后能提供丰富的 执行情况结果信息。例如,总执行时间、失败用例数、成功用例数等。


  从这几点来看,单元测试框架可以帮助我们完成任何类型测试的自动化。


  单元测试:unittest


  HTTP接口自动化测试:unittest+Requests


  Web UI自动化测试:unitte+Selenium


  移动自动化测试:unittest+Appium


  假设有如下功能。


  """Describe:实现简单计算器:+、—、*、八"""


  class Calculator():


      """实现两个数的加、减、乘、除口"""


      def _init_(self, a, b):


          self.a = int(a)


          self.b = int(b)  # 加法


      def add(self):


          return self.a + self.b  # 减法


      def sub(self):


          return self.a - self.b  # 乘法


      def mul(self):


          return self.a * self.b  # 除法


      def div(self):


          return self.a / self.b




  首先,需要声明的是,不用单元测试框架一样可以做单元测试。接下看看不用单元测试框架,如何做单 元测试。


  from count import Calculator


  class CountTest:


      def test_add_4_5(self)

:
          c=Calculator(4,5)


          result=c.add()


          try:


              assert result == 9, "assertion failure."


          except AssertionError as e:


              print(e)


  if __name__== "_main_":


      t= CountTest()


      t.test_add_4_5()




  这里只针对Calculator类的add(方法编写了一条测试用例。


  首先,导入count.py文件中的Calculator类,Calculator类需要初始化两个参数,然后,调用add(方法, 得到两个参数相加的返回结果;通过assert断言如果返回结果等于预期结果9,那么测试通过,否



则,抛出 AssertionError异常,并打印“assertion failure.”的异常信息。

  那么,通过unittest单元测试框架如何编写测试用例。


  from count import Calculator import unittest


  class CountTest(unittest.TestCase):


      def setUp(self):


          self.c=Calculator(8, 4)


      def tearDown(self):


          pass


      def test_add(self):


          result = self.c.add()


          self.assertEqual(result,12)


      def test_sub(self):


          result=self.c.sub()


          self.assertEqual(result,4)


      def test_mul(self):


          result = self.c.mu1()


          self.assertEqual(result, 32)


      def test_div(self):


          result = self.c


          self.c.div()


          self.assertEqual(result, 2)


  if __name__ == "_main_":


      unittest.main()




  从感官上来看,通过unittest单元测试框架编写测试更新规范和整洁。接下来,分析一下unittest单元测 试框架的结构。


  首先,通过import 导入 unittest单元测试框架。 创建 CountTest类继承 unittest.TestCase类。 setUpO 和tearDo。


  在单元测试框架中比较特别,它们分别在每一个测试用例的开始和结束执行。setUp0 方法用于测试用例执行前的初始化工作,例如初始化变量、生成数据库测试数据、打开浏览器等。tearDown() 方



法与setUpO方法相呼应,用于测试用例执行之后的善后工作,例如清除数据库测试数据、关闭浏览器等。 unittest要求测试方法必须以“test”开头。例如,test_add、test_sub等。


  最后,通过unittest.main(方法查询并执行继承了unittest.TestCase的类下面,并且以“test”开头的方法。 执行结果如下:




从执行结果可以看到通过一个小点“.”来表示一条运行通过的用例,总共运行4条测试用例,用时0.001 秒。

  关于unittest单元测试框架,我在《Selenium2 自动化测试实战——基于Python语言》一书中花一个章来介 绍,读者可以参考此书来学习。另外,Python 官方文档也是非常不错的参考资



料,如图:







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-22 21:06 , Processed in 0.065796 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表