python如何编写测试代码

python内置了unittest,使得写应用层的单元测试变得超乎寻常的简单。

1,执行单个测试函数

  1. #!/bin/python
  2.  
  3. import unittest
  4.  
  5. class TestMathFunc(unittest.TestCase):
  6. def test_add(self):
  7. self.assertEqual(3, 1+2)
  8. self.assertEqual(4, 2+2)
  9. self.assertNotEqual(3, 1+3)
  10.  
  11. def runTest(self):
  12. self.test_add()
  13.  
  14. suite = unittest.TestSuite()
  15. testCase = [TestMathFunc()]
  16. suite.addTests(testCase)
  17. runner = unittest.TextTestRunner(verbosity = 2)
  18. runner.run(suite)

单元测试,只需要仿照上面的例子写就可以完成自己的测试代码。

其中包含几个部分:

a,测试类(要继承unittest.TestCase);

b,测试小组件,unittest.TestSuite,负责将测试类装入进来;

c,执行类,unittest.TextTestRunner;

2,执行多个测试函数

  1. #!/bin/python
  2.  
  3. import unittest
  4.  
  5. class TestMathFunc(unittest.TestCase):
  6. def test_add(self):
  7. self.assertEqual(3, 1+2)
  8. self.assertEqual(4, 2+2)
  9. self.assertNotEqual(3, 1+3)
  10.  
  11. def test_minus(self):
  12. self.assertEqual(-1, 1-2)
  13.  
  14. def runTest(self):
  15. self.test_add()
  16. self.test_minus()
  17.  
  18. suite = unittest.TestSuite()
  19. #testCase = [TestMathFunc('test_add'), TestMathFunc('test_minus')]
  20. testCase = [TestMathFunc()]
  21. suite.addTests(testCase)
  22. runner = unittest.TextTestRunner(verbosity = 2)
  23. runner.run(suite)

修改runTest函数,将测试函数包含进来即可。

3,执行多个测试类

  1. #!/bin/python
  2.  
  3. import unittest
  4.  
  5. class TestStringFunc(unittest.TestCase):
  6. def test_str_concat(self):
  7. self.assertEqual("abcabc", "abc" + "abc")
  8.  
  9. def runTest(self):
  10. self.test_str_concat()
  11.  
  12. class TestMathFunc(unittest.TestCase):
  13. def test_add(self):
  14. self.assertEqual(3, 1+2)
  15. self.assertEqual(4, 2+2)
  16. self.assertNotEqual(3, 1+3)
  17.  
  18. def test_minus(self):
  19. self.assertEqual(-1, 1-2)
  20.  
  21. def runTest(self):
  22. self.test_add()
  23. self.test_minus()
  24.  
  25. suite = unittest.TestSuite()
  26. testCase = [TestMathFunc(), TestStringFunc()]
  27. suite.addTests(testCase)
  28. runner = unittest.TextTestRunner(verbosity = 2)
  29. runner.run(suite)

在suite添加多个测试类,即可。

当然还有另外的方式:

  1. ...
  2.  
  3. suite = unittest.TestSuite()
  4.  
  5. testCase = [TestMathFunc()]
  6. suite.addTests(testCase)
  7.  
  8. testCase2 = TestStringFunc()
  9. suite.addTest(testCase2)
  10.  
  11. runner = unittest.TextTestRunner(verbosity = 2)
  12. runner.run(suite)

通过以上代码片段,即可实现,自主地控制多个测试类,自主地控制多个函数执行测试,十分方便。

4,有时候我们不想每个测试函数都显示调用,而是加载所有test_开头的测试函数,怎么做?

构建两个文件:t3.py,main.py

main文件存放执行代码,t3文件仅存放测试类,不存放任何执行代码

main.py

  1. #!/bin/python
    #main.py
  1. import unittest
  2. from t3 import TestMathFunc, TestStringFunc
  3.  
  4. suite2 = unittest.TestLoader().discover('.', 't3.py')
  5.  
  6. runner = unittest.TextTestRunner(verbosity = 2)
  7. runner.run(suite2)

t3.py

  1. #!/bin/python
  2. #t3.py
  3.  
  4. import unittest
  5.  
  6. class TestStringFunc(unittest.TestCase):
  7. def test_str_concat(self):
  8. self.assertEqual("abcabc", "abc" + "abc")
  9.  
  10. # def runTest(self):
  11. # self.test_str_concat()
  12.  
  13. class TestMathFunc(unittest.TestCase):
  14. def test_add(self):
  15. self.assertEqual(3, 1+2)
  16. self.assertEqual(4, 2+2)
  17. self.assertNotEqual(3, 1+3)
  18.  
  19. def test_minus(self):
  20. self.assertEqual(-1, 1-2)
  21.  
  22. # def runTest(self):
  23. # self.test_add()
  24. # self.test_minus()

执行main.py,输出结果:

  1. test_add (t3.TestMathFunc) ... ok
  2. test_minus (t3.TestMathFunc) ... ok
  3. test_str_concat (t3.TestStringFunc) ... ok
  4.  
  5. ----------------------------------------------------------------------
  6. Ran 3 tests in 0.001s

通过 unittest.TestLoader().discover('.', 't3.py') 将t3文件中包含的所有测试类导入到suite中。

依赖这个功能,我们可以将所有的需要测试的文件,导入到main主函数中,进行集中管理和测试。注意:这里不再依赖runTest函数,只要函数名中包含test前缀就会被包含进来。

5,有时候测试用例需要提供上下文环境,怎么做?

我们针对例子4,仅修改t3.py测试类。

  1. class TestMathFunc(unittest.TestCase):
  2. def setUp(self):
  3. print("\nTestMathFunc:setup")
  4. self.a = 1
  5. self.b = 2
  6.  
  7. def test_add(self):
  8. self.assertEqual(3, 1+2)
  9. self.assertEqual(4, 2+2)
  10. self.assertNotEqual(3, 1+3)
  11. self.assertEqual(3, self.a + self.b)
  12.  
  13. def test_minus(self):
  14. self.assertEqual(-1, 1-2)

这里我们准备了环境信息(准备两个变量a和b),使用这两个变量进行单元测试。

  1. test_add (t3.TestMathFunc) ...
  2. TestMathFunc:setup
  3. ok
  4. test_minus (t3.TestMathFunc) ...
  5. TestMathFunc:setup
  6. ok
  7. test_str_concat (t3.TestStringFunc) ... ok
  8.  
  9. ----------------------------------------------------------------------
  10. Ran 3 tests in 0.002s
  11.  
  12. OK

函数的输出如上。

类的单元测试,每个函数执行之前都会执行setUp函数。

对应的是tearDown,用来销毁构建的环境信息。可以自己尝试下。

参考网站:

更详细的解释:https://www.jianshu.com/p/38948d0d73f5

最详细的官方文档:https://docs.python.org/3/library/unittest.html#module-unittest

25 【python入门指南】如何编写测试代码的更多相关文章

  1. 使用 xunit 编写测试代码

    使用 xunit 编写测试代码 Intro xunit 是 .NET 里使用非常广泛的一个测试框架,有很多测试项目都是在使用 xunit 作为测试框架,不仅仅有很多开源项目在使用,很多微软的项目也在使 ...

  2. AngularJS快速入门指南19:示例代码

    本文给出的大部分示例都可以直接运行,通过点击运行按钮来查看结果,同时支持在线编辑代码. <div ng-app=""> <p>Name: <input ...

  3. 《Three.js 入门指南》3.0 - 代码构建的最基本结构。

    3.0 代码构建的最基本结构 说明: 我们必需首先知道,Three.js 的一些入门级概念: 我们需要知道,OpenGL 是一套三维实现的标准,为什么说是标准,因为它是跨平台,跨语言的.甚至CAD以及 ...

  4. Python入门指南(超详细)

    Python 是一门非常容易上手的语言,通过查阅资料和教程,也许一晚上就能写出一个简单的爬虫.但 Python 也是一门很难精通的语言,因为简洁的语法背后隐藏了许多黑科技.本文主要针对的读者是: 毫无 ...

  5. python入门机器学习,3行代码搞定线性回归

    本文着重是重新梳理一下线性回归的概念,至于几行代码实现,那个不重要,概念明确了,代码自然水到渠成. “机器学习”对于普通大众来说可能会比较陌生,但是“人工智能”这个词简直是太火了,即便是风云变化的股市 ...

  6. Python 入门指南

    Release: 3.4 Date: March 29, 2014 Python 是一门简单易学且功能强大的编程语言. 它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程. Pyt ...

  7. 24 【python入门指南】class

    一.类 1.1,构造函数,析构函数 #!/bin/python class dog(): def __init__(self, age, name): self.age = age self.name ...

  8. 4、基于JZ2440之编写测试代码处理(处理图片识别人脸)

    1.代码如下: void detectAndDisplay(Mat image) { CascadeClassifier ccf; //创建脸部对象 //ccf.load(xmlPath); //导入 ...

  9. python测试代码

    前言: 编写函数或者类时,需要编写测试代码,来保证其的功能运行是否按预期的那样工作.在程序添加新的代码时,用来测试是否会破坏本身的功能. 我们使用python自带的unittest模块来测试代码. 编 ...

随机推荐

  1. 快速掌握和使用Flyway

    什么是Flyway? 转载:https://blog.waterstrong.me/flyway-in-practice/ Flyway is an open-source database migr ...

  2. day16-小数据池

    一,什么是代码块 Python程序是由代码块构造的.块是一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命 ...

  3. ORM查询api

    下面的方法都是对查询的结果进行出理:比如objects.filter.values()... 1)values(*field):返回一个可迭代的字典序列<QuerySet: [{name='小王 ...

  4. list<T>中的按特定顺序排序

    前段时间有个任务,就是把参数要按特定顺序排序,就是要是在一张大的参数表中,只选取,2,5,12,9,13,10 这几个参数,并按上述顺序进行排序. 假设这个参数在一个类中.例如: 上述参数序列就存在P ...

  5. Servlet基本_オブジェクトのスコープ

    1.スコープ種類Servletには以下のスコープがあります.Request.Session.Applicationの順にスコープは広くなっていきます.・Applicationスコープ:アプリケーション ...

  6. Linux命令:ssh-add

    ssh-add帮助 SSH-ADD() BSD General Commands Manual SSH-ADD() NAME ssh-add — adds private key identities ...

  7. 一次UNITY闪退问题的定位心得

    最近项目测试发现,运行unity后不退出运行模式,玩了一局后点击 “再来一局”,反复十几局后unity崩掉. 经观察,发现在这十几局的过程中,unity占用内存不断上升,由3.2G左右上升到3.6G左 ...

  8. mysql主从复制搭建中几种log和pos详解

    一.主从原理 Replication 线程   Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql in ...

  9. 今天学习到的几条shell技巧

    1.获取某个进程的进程号 PID=`ps aux | grep 进程名 | grep -v "grep" | awk '{print $2}'` 2.获取某个进程的CPU(同理可获 ...

  10. 用adb取出在手机中安装的apk

    第一步:列出所有安装的apk adb shell pm list packages 然后找到自己要取出来的apk的包名. 第二布:找到apk的位置(后面跟上包名) adb shell pm path ...