unittest 单元测试:

1,单元测试是指对软件中最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来讲,要根据实际情况去判定其具体含义。

2,unitest=TestCase + TestResult  执行 + 结果

3,首先使用import unitest

4,测试的类都是继承于TestCase类

5, setUp()测试前的初始化工作;tearDown()测试后的清除工作(在每个测试方法运行时被调用)

注意:

1,所有类中方法入参为self,定义方法的变量也要“self.变量”(熟悉python的写法其实就是类变量的调用)

2,定义测试用例,以“test”开头命名的方法,方法的入参为self

3,unitest.main()方法会搜索该模块下所有的以test开头的测试用例方法,并且自动执行它们

4,成功会输出,失败是F

先看一个例子:

  1. # -*- coding:UTF-8 -*-
  2. __autor__ = 'zhouli'
  3. __date__ = '2018/11/7 21:15'
  4.  
  5. import unittest
  6.  
  7. class UserTestCase(unittest.TestCase):
  8. def setUp(self):
  9. print("--setup--")
  10.  
  11. def tearDown(self):
  12. print("--tearDown--")
  13.  
  14. def test_name(self):
  15. print('--name--')
  16.  
  17. if __name__ == '__main__':
  18. unittest.main()

运行的结果为:

  1. .
  2. --setup--
  3. ----------------------------------------------------------------------
  4. --name--
  5. Ran 1 test in 0.000s
  6. --tearDown--
  7.  
  8. OK

可以看到的顺序是先执行setup方法之后,再去执行自定义的测试方法,最终使用tearDown来进行收尾

再看补充,因为在unitest中必须以test_开头来定义方法,因此新增几个方法。

  1. # -*- coding:UTF-8 -*-
  2. __autor__ = 'zhouli'
  3. __date__ = '2018/11/7 21:15'
  4.  
  5. import unittest
  6.  
  7. class UserTestCase(unittest.TestCase):
  8. def setUp(self):
  9. print("--setup--")
  10.  
  11. def tearDown(self):
  12. print("--tearDown--")
  13.  
  14. def test_name(self):
  15. print('--name--')
  16.  
  17. def test_isupper(self):
  18. print('--upper')
  19.  
  20. def test_age(self):
  21. print('--age')
  22.  
  23. if __name__ == '__main__':
  24. unittest.main()

执行的结果为:

  1. --setup--
  2. ...
  3. --age
  4. ----------------------------------------------------------------------
  5. --tearDown--
  6. Ran 3 tests in 0.000s
  7. --setup--
  8.  
  9. --upper
  10. OK
  11. --tearDown--
  12. --setup--
  13. --name--
  14. --tearDown--

也就是说,每一个自定义方法开始会调用setup,然后调用自定义方法,然后调用tearDown方法

  1. # -*- coding:UTF-8 -*-
  2. __autor__ = 'zhouli'
  3. __date__ = '2018/11/7 21:15'
  4.  
  5. import unittest
  6.  
  7. class UserTestCase(unittest.TestCase):
  8. def setUp(self):
  9. print("--setup--")
  10.  
  11. def tearDown(self):
  12. print("--tearDown--")
  13.  
  14. def test_name(self):
  15. self.assertEqual('foo'.upper(), "FoO", msg='转换不对') # msg=是报错之后的提示信息
  16. print('--name--')
  17.  
  18. def test_isupper(self):
  19. print('--upper')
  20.  
  21. def test_age(self):
  22. print('--age')
  23.  
  24. if __name__ == '__main__':
  25. unittest.main()

结果如下:

  1. --setup--
  2. ..F
  3. --age
  4. ======================================================================
  5. --tearDown--
  6. FAIL: test_name (__main__.UserTestCase)
  7. --setup--
  8. ----------------------------------------------------------------------
  9. --upper
  10. Traceback (most recent call last):
  11. --tearDown--
  12. File "C:/Users/lenovo/Desktop/新建文件夹/自动化测试selenium/unitest_import.py", line 16, in test_name
  13. --setup--
  14. self.assertEqual('foo'.upper(), "FoO", msg='转换不对') # msg=是报错之后的提示信息
  15. --tearDown--
  16. AssertionError: 'FOO' != 'FoO'
  17. - FOO
  18. ? ^
  19. + FoO
  20. ? ^
  21. : 转换不对
  22.  
  23. ----------------------------------------------------------------------
  24. Ran 3 tests in 0.000s
  25.  
  26. FAILED (failures=1)

三个test失败1个,报错信息为转换不对,总体结论为..F

测试套件TestSuite介绍:

需求:

1,利用unitest执行流程测试而非单元测试

2,控制unitest的执行顺序

① unitest.TestSuite()类来表示一个测试用例集

1,用来确定测试用例的执行顺序,决定先后执行

2,如果一个class中有四个test开头的方法,则加载到suite中则有四个测试用例

3, 由TestLoder加载TestCase到TestSuite

4, verbosity参数可以控制执行结果的输出, 0是简单报告,1是一般报告, 2是详细报告

默认1 会在每个成功的用例前面有个“.”每个失败用例前面有个“F”

② TextTestRunner() 文本测试用例运行器

③ run()方法是运行测试套件的测试用例,入参为suite测试套件

  1. # -*- coding:UTF-8 -*-
  2. __autor__ = 'zhouli'
  3. __date__ = '2018/11/10 21:37'
  4.  
  5. import unittest
  6.  
  7. class UserTestCase(unittest.TestCase):
  8. def setUp(self):
  9. self.age = 25
  10. self.name = "呦西,开始了"
  11. print('setup method------')
  12.  
  13. def tearDown(self):
  14. print("--tearDown method------")
  15.  
  16. def test_one(self):
  17. print("test_one 周先生来了")
  18. self.assertEqual(self.name, "呦西,开始了", msg="口令不对!")
  19.  
  20. def test_two(self):
  21. print('test_two')
  22. self.assertFalse("ZL".isupper(), msg="不是大写")
  23.  
  24. def test_three(self):
  25. print('test_three')
  26. self.assertEqual(self.age, 25)
  27.  
  28. def test_four(self):
  29. print('test_four')
  30. self.assertEqual(self.age, 25)
  31.  
  32. if __name__ == '__main__':
  33. suite = unittest.TestSuite()
  34. suite.addTest(UserTestCase("test_one")) # 测试类名加方法
  35.  
  36. # verbosity参数可以控制执行结果的输出, 0是简单报告,1是一般报告, 2是详细报告 默认1 会在每个成功的用例前面有个“.”每个失败用例前面有个“F”
  37. runner = unittest.TextTestRunner(verbosity=0)
  38. runner.run(suite)

运行结果如下:

  1. setup method------
  2. ----------------------------------------------------------------------
  3. Ran 1 test in 0.000s
  4. test_one 周先生来了
  5.  
  6. --tearDown method------
  7. OK

如果增加多个呢?

  1. suite.addTest(UserTestCase("test_four"))
  2. suite.addTest(UserTestCase("test_two"))
  3. suite.addTest(UserTestCase("test_three"))

注意顺序,这个是指定的顺序添加之后,结果如下:

  1. setup method------
  2. test_one 周先生来了
  3. --tearDown method------
  4. setup method------
  5. test_four
  6. --tearDown method------
  7. setup method------
  8. test_two
  9. --tearDown method------
  10. setup method------
  11. test_three
  12. --tearDown method------
  13. ----------------------------------------------------------------------
  14. Ran 4 tests in 0.001s
  15.  
  16. OK

完整代码如下:

  1. # -*- coding:UTF-8 -*-
  2. __autor__ = 'zhouli'
  3. __date__ = '2018/11/10 21:37'
  4.  
  5. import unittest
  6.  
  7. class UserTestCase(unittest.TestCase):
  8. def setUp(self):
  9. self.age = 25
  10. self.name = "呦西,开始了"
  11. print('setup method------')
  12.  
  13. def tearDown(self):
  14. print("--tearDown method------")
  15.  
  16. def test_one(self):
  17. print("test_one 周先生来了")
  18. self.assertEqual(self.name, "呦西,开始了", msg="口令不对!")
  19.  
  20. def test_two(self):
  21. print('test_two')
  22. self.assertFalse("zl".isupper(), msg="不是大写")
  23.  
  24. def test_three(self):
  25. print('test_three')
  26. self.assertEqual(self.age, 25)
  27.  
  28. def test_four(self):
  29. print('test_four')
  30. self.assertEqual(self.age, 25)
  31.  
  32. if __name__ == '__main__':
  33. suite = unittest.TestSuite()
  34. suite.addTest(UserTestCase("test_one")) # 测试类名加方法
  35. suite.addTest(UserTestCase("test_four"))
  36. suite.addTest(UserTestCase("test_two"))
  37. suite.addTest(UserTestCase("test_three"))
  38.  
  39. # verbosity参数可以控制执行结果的输出, 0是简单报告,1是一般报告, 2是详细报告 默认1 会在每个成功的用例前面有个“.”每个失败用例前面有个“F”
  40. runner = unittest.TextTestRunner(verbosity=2)
  41. runner.run(suite)

unittest 单元测试的更多相关文章

  1. Node.js的UnitTest单元测试

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; } 在专业化的软件开发过程中,无论什么平台语言,现在都需要UnitTes ...

  2. 我的TDD实践---UnitTest单元测试

    我的TDD实践---UnitTest单元测试 “我的TDD实践”系列之UnitTest单元测试 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则 ...

  3. unittest单元测试框架总结

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  4. unittest单元测试框架详解

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

  5. Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型

    1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

  6. unittest单元测试框架

    unittest单元测试框架 概述: 单元测试框架主要用来完成以下三件事: 提供用例组织与执行:当测试用例只有几条时,可以不必考虑用例的组织,但是当用例达到成百上千条时,大量的用例堆砌在一起,就产生了 ...

  7. python unittest单元测试

    unittest单元测试框架:包含测试用例编写.测试收集\测试用例加载.执行测试用例.生成测试用例报告,同时,更提供了添加断言,异常处理等. 第一:创建测试类,创建测试用例 第二:收集测试用例,加载测 ...

  8. python之unittest单元测试

    # unittest单元测试 import unittest from class_demo import Car class TestCar(unittest.TestCase): '''测试Car ...

  9. unittest单元测试简单介绍

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者 ...

随机推荐

  1. Activity生命周期,切换,参数传递,bundle(包),值对象,Activity参数返回,Activity的启动模式

    Activity代表手机屏幕的一屏,或是平板电脑中的一个窗口.它是android应用中最重要的组成单元之一,提供了和用户交互的可视化界面.在一个Activity中,可以添加很多组件,这些组件负责具体的 ...

  2. linux 3.10 一次softlock排查

    x86架构.一个同事分析的crash,我在他基础上再次协助分析,也没有获得进展,只是记录一下分析过程.记录是指备忘,万一有人解决过,也好给我们点帮助. 有一次软锁,大多数cpu被锁,log中第一个认为 ...

  3. 【转】解决Eclipse中SVN版本信息不显示的问题

    eclipse 中使用 svn 插件,原本正常,未作任何更改,最近几天突然eclipse 中查看文件时,文件后面的 版本号 . 文件的状态图标 等等都不见了.以为有插件冲突,卸载了好多其他的相关的插件 ...

  4. Android DevArt3:SingleTask启动模式探究:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity, 再从C中又启动AActivity, 最后在A中启动B,现在按两次back键,然后回到的是哪个Activity? 答案是,回到MainActivity。

    SingleTask启动模式探究 GitHub如题:首先从MainActivity启动案例入口AActivity,并在A中启动BActivity,从B启动CActivity,再从C中又启动AActiv ...

  5. server安装

    ArcGIS Server Enterprise10 安装过程 1.ArcGIS Server Enterprise10 安装之前先检查下系统有没有安装IIS.右击电脑--管理--服务和应用程序--I ...

  6. 使用firefox插件httperrequest,模拟发送及接收Json请求 【转】

    转自[http://blog.csdn.net/feixue1232/article/details/8535212] 目标:使用httpreques\Json-Handle\tcpdump\wire ...

  7. Mybatis之mapper.xml配置文件中的#{}和${}

    #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换.#{}可以有效防止sql注入. #{}可以接收简单类型值或pojo ...

  8. CentsOS6 Tomcat7 报javax.management.InstanceNotFoundException 解决办法

    警告: Failed to unregister MBean with name [Catalina:j2eeType=Servlet,name=UploadServlet,WebModule=//l ...

  9. workerman 平滑重启

    <?phpuse Workerman\Worker;use Workerman\Lib\Timer; require_once '../../web/Workerman/Autoloader.p ...

  10. sass 使用clac的问题

    最后在github的issue中找到了方法,要想在sass的calc中使用变量,必须对这个变量使用sass的插值方法(#{$variable}). 所以把代码改正下面的形式就可以了: width: c ...