如果您对暂时禁用单个Python单元测试感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于暂时禁用单个Python单元测试的详细内容,我们还将为您解答暂停python程序的相关
如果您对暂时禁用单个Python单元测试感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于暂时禁用单个Python单元测试的详细内容,我们还将为您解答暂停python程序的相关问题,并且为您提供关于Django中的单元测试以及Python单元测试、python – 如何在执行Django单元测试时禁用第三方API?、Python 使用单元测试、python单元测试的有价值信息。
本文目录一览:- 暂时禁用单个Python单元测试(暂停python程序)
- Django中的单元测试以及Python单元测试
- python – 如何在执行Django单元测试时禁用第三方API?
- Python 使用单元测试
- python单元测试
暂时禁用单个Python单元测试(暂停python程序)
unittest
在Python中使用模块时,如何暂时禁用单个单元测试?
Django中的单元测试以及Python单元测试
Python单元测试
是用来对一个模块、一个函数或者一个类进行正确性检验的测试工作。
在Python中unittest是它内置的单元测试框架,单元测试与功能测试都是日常开发中必不可少的部分。
比如对函数abs(),我们可以编写出一下几个测试用例:
- 输入正数,比如1,1.2,0.99,我们期待返回值与输入相同
- 输入负数,比如-1,-1.2,-0.99,我们期待返回值与输入值相反
- 输入0,我们期待返回0
- 输入非数值类型,比如None,[],{},我们期待抛出TypeError
把上面的测试用例放到一个测试模块里,就是一个完整的单元测试。
一个简单的测试用例
定义一个类,简单的实现add、sub两方法,并对其进行单元测试
待测试文件m1.py
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4
5 class MyClass(object):
6 def __init__(self, x, y):
7 self.x = int(x)
8 self.y = int(y)
9
10 def add(self):
11 return self.x + self.y
12
13 def sub(self):
14 return self.x - self.y
在m1.py同级目录下创建test.py测试文件,使用unittest单元测试框架对MyClass的方法进行测试
1 #!/usr/bin/env python
2 # -*- coding:utf-8 -*-
3
4 import unittest
5 from m1 import MyClass
6
7
8 class MyclassTest(unittest.TestCase):
9 def setUp(self):
10 self.calc = MyClass(7, 5)
11
12 def tearDown(self):
13 pass
14
15 def test_add(self):
16 ret = self.calc.add()
17 self.assertEqual(ret, 12)
18
19 def test_sub(self):
20 ret = self.calc.sub()
21 self.assertEqual(ret, 2)
22
23
24 # if __name__ == ''__main__'':
25 # suite = unittest.TestSuite()
26 # suite.addTest(MyclassTest(''test_add''))
27 # suite.addTest(MyclassTest(''test_sub''))
28 #
29 # runner = unittest.TextTestRunner()
30 # runner.run(suite)
31
32 if __name__ == ''__main__'':
33 unittest.main()
运行测试
1 python -m unittest test
2 ..
3 ----------------------------------------------------------------------
4 Ran 2 tests in 0.000s
5
6 OK
总结:
编写单元测试时,我们需要编写一个测试类,从unittest.TestCase继承,unittest.TestCase提供了很多内置的条件判断,我们只需要调用这些方法就可以断言输出是否是我们所期望的。最常用的断言就是assertEqual()方法
运行单元测试:
1 一旦编写好单元测试,我们就可以运行单元测试。最简单的运行方式是在test.py的最后加上两行代码:
2 if __name__ == ''__main__'':
3 unittest.main()
4 这样就可以把test.py当做正常的python脚本运行:
5 $ python test.py
6 另一种方法是在命令行通过参数-m unittest直接运行单元测试:
7 $ python -m unittest test
unittest框架小知识点梳理
1. test fixture:是初始化和清理测试数据及环境,通过重写TestCase的setUp()和tearDown()方法实现
两方法使用:设想你的测试需要启动一个数据库,这时,就可以在setUp()方法中连接数据库,在tearDown()方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:
1 class MyclassTest(unittest.TestCase):
2
3 def setUp(self):
4 print(''setUp...'')
5
6 def tearDown(self):
7 print(''tearDown...'')
2.test case:是测试用例
3.test suite:是测试用例的集合,通过addTest加载TestCase到TestSuite中,返回一个TestSuite实例
4.test runner:是运行测试用例并返回结果,通过TextTestRunner类提供的run()方法来执行test suite或test case
注意:
单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug
Django中的单元测试
在创建app的时候,在app目录下自动生成tests.py文件
Model部分单元测试用例
1 from django.db import models
2
3 # Create your models here.
4
5
6 class Book(models.Model):
7 title = models.CharField(max_length=32)
8 price = models.DecimalField(max_digits=10, decimal_places=2)
测试用例代码
1 from django.test import TestCase
2 from app01.models import Book
3 # Create your tests here.
4
5
6 class BookModelTest(TestCase):
7 def setUp(self):
8 Book.objects.create(title=''斗破苍穹'', price=10.99)
9
10 def test_book_model(self):
11 from decimal import Decimal
12 result = Book.objects.get(title=''斗破苍穹'')
13 self.assertEqual(result.price, Decimal(''10.99''))
运行测试在项目目录下运行:
1 python manage.py test
2 Creating test database for alias ''default''...
3 System check identified no issues (0 silenced).
4 .
5 ----------------------------------------------------------------------
6 Ran 1 test in 0.002s
7
8 OK
9 Destroying test database for alias ''default''...
视图部分单元测试用例
1 from django.shortcuts import render
2
3 # Create your views here.
4
5
6 def index(request):
7 return render(request, ''index.html'')
在app01/tests.py文件中添加测试用例代码:
1 class IndexPageTest(TestCase):
2 """测试index页面"""
3 def test_index_page_renders_index_template(self):
4 """测试index视图"""
5 response = self.client.get(''/index/'')
6 self.assertEqual(response.status_code, 200) # 判断状态码
7 self.assertTemplateUsed(response, ''index.html'') # 判断渲染的模板是否正确
运行单元测试:
1 python manage.py test
2 Creating test database for alias ''default''...
3 System check identified no issues (0 silenced).
4 ..
5 ----------------------------------------------------------------------
6 Ran 2 tests in 0.044s
7
8 OK
9 Destroying test database for alias ''default''...
python – 如何在执行Django单元测试时禁用第三方API?
我有一个自定义类MailChimpAPI,它本质上充当我正在使用的Python库的瘦包装器.以下是代码的一些相关部分:
class MailChimpAPI(object): """ A wrapper for implementing business logic and exception handling around the PyChimp API """ ... def __init__(self,api_key,primary_list_id,merge_keys,use_secure=True,timeout=None): ... # setup api self.api_key = api_key self.api = PyChimp(self.api_key) ... ... def _call(self,method_name,args=[],kwargs={}): """Calls the PyChimp API directly""" result = getattr(self.api,method_name)(*args,**kwargs) if self.api.errorCode: self._raise_mailchimp_exception() else: return result ...
我剪掉了(…)实现业务逻辑等的大多数代码,但这里的突出方面是我将api属性设置为__init __()中的PyChimp(第三方库)实例,以及所有对该库的实际调用是在_call()函数中进行的.
我对单元测试有些新意,所以我很难找到解决这个问题的最佳方法.我的一个想法是在我的类之外实例化PyChimp库并将其传递给构造函数.另一个想法是测试这个我可以模拟_call方法,以便它不会碰到实际的库.
我遇到的首要问题是,显然,我不想针对实际的API执行任何测试代码.因此,我试图找出“存根”或“模拟”该API的最佳方法,以便在测试期间对其进行的调用实际上不会执行.理想情况下,我希望在Django测试套件中运行所有测试时都存在该模拟API.例如,每当通过post_save信号创建用户帐户时,我正在探索将用户同步到MailChimp的可能性.出于这个原因,我显然不希望在Django身份验证应用程序中运行的测试也触发实际的API.
我希望Django有一些全局设置/拆卸挂钩或我可以使用的信号,但似乎没有任何东西.
有没有人对如何在测试过程中用假装一个干净地替换“实时”API有任何建议?或者我完全错了吗?
我非常有信心我可以通过自己的方式找到解决方案,但如果有人能够分享一些关于采用这种方式的“最佳”方式的智慧,那将会很棒.
解决方法
您可以创建一个MockPyChimp类,它具有与实际PyChimp api相同的方法.这样,您可以轻松地在测试中重用相同的模拟类.
我对python / django单元测试不够熟悉,能够建议任何特定的库来协助这个,但我会假设存在某种类似的模拟库.
Python 使用单元测试
单元测试是用来对一个函数、一个类或者一个模块进行正确性检验的测试工作。
使用 unittest 模块做单元测试
1)对函数进行测试
下面是一个简单的函数,它接收名和姓,返回整洁的姓名:
name_function.py
def get_formatted_name(first, last):
full_name = first + '' '' + last
return full_name.title()
函数 get_formatted_name 将名和姓组成一个完整的名字,并在名和姓之间添加一个空格,同时将首字母大写,再返回结果。
单元测试这样写:
test_name_function.py
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
'''''' test_function Begin''''''
def test_first_last_name(self):
formatted_name = get_formatted_name(''du'',''xiaodong'')
self.assertEqual(formatted_name,''Du Xiaodong'')
unittest.main()
需要注意的是,1. 引入了 unittest 模块并且 NamesTestCase 需要继承 unittest.TestCase 类。2. 所有的测试函数都需要是 test_function 开头,并且需要在代码最后执行 unittest.main ()
当执行测试文件时,测试用例就会被自动执行。如果你的测试正确,执行 python test_name_function.py,显示如下:
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
2)对类进行测试
这里写一个类 Employee,其中__init__() 接收姓名和年薪,其中 give_raise () 这个方法是加薪,默认加薪 5000。
Employee.py
class Employee():
def __init__(self,name,salary):
self.name = name
self.salary = salary
def give_raise(self,money = 5000):
self.salary += money
测试类 test_Employee.py
import unittest
from Employee import Employee
class TestEmployee(unittest.TestCase):
def setUp(self):
self.employee = Employee(''Du Xidong'', 100000)
def test_raise(self):
self.employee.give_raise(10000)
self.assertEqual(110000,self.employee.salary)
unittest.main()
这里需要指出的是 setUp () 这个方法类构造的时候会被执行,然后运行 python test_Employee.py 会得到如下的结果:即测试用例通过
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
总结
1、单元测试类必须继承 unit.TestCase 类,2、测试函数必须以 test_function 开头,3、使用断言 assertEqual 或者其他单元具体查看 unittest module 中的断言方法 assertIn (item,list) 等
python单元测试
示例代码:
#coding:utf-8
import unittest
class Template(unittest.TestCase):
def setUp(self,tclass): #初始化
self.tclass = tclass
def tearDown(self): #清除功能
pass
def testFunc(self): #必须是testXXX
pass
class FuncTest(unittest.TestCase):
def test_add(self):
self.assertEqual(1+2, 5, "功能测试")
class AntiTest(unittest.TestCase):
def test_sub(self):
self.assertIsNot(1+2, 5, "反例测试")
class RasiTest(unittest.TestCase):
def test_sub(self):
self.assertRaises(ZeroDivisionError, 1/0)
def suite():
def tosuite(testCaseClass):
return unittest.makeSuite(testCaseClass)
suite = unittest.TestSuite()
suite.addTest(tosuite(FuncTest))
suite.addTest(tosuite(AntiTest))
suite.addTest(tosuite(RasiTest))
return suite
if __name__ == "__main__":
unittest.main()
除了可以使用main来实施测试还可以使用TextTestRunner
# 测试
if __name__ == "__main__":
# 构造测试集
suite = unittest.TestSuite()
suite.addTest(WidgetTestCase("testSize"))
suite.addTest(WidgetTestCase("testResize"))
# 执行测试
runner = unittest.TextTestRunner()
runner.run(suite)
参考链接
https://www.ibm.com/developerworks/cn/linux/l-pyunit/
今天关于暂时禁用单个Python单元测试和暂停python程序的讲解已经结束,谢谢您的阅读,如果想了解更多关于Django中的单元测试以及Python单元测试、python – 如何在执行Django单元测试时禁用第三方API?、Python 使用单元测试、python单元测试的相关知识,请在本站搜索。
本文标签: