- Nose Testing - Tools
- Nose Testing - Framework
- UnitTest Framework - Py.test Module
- UnitTest Framework - Doctest API
- UnitTest Framework - Doctest
- UnitTest Framework - Signal Handling
- UnitTest Framework - Unittest2
- UnitTest Framework - Time Test
- UnitTest Framework - Exceptions Test
- UnitTest Framework - Skip Test
- UnitTest Framework - Test Discovery
- UnitTest Framework - Assertion
- UnitTest Framework - API
- UnitTest Framework - Framework
- UnitTest Framework - Overview
- UnitTest Framework - Home
UnitTest Framework Resources
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
UnitTest Framework - Quick Guide
UnitTest Framework - Overview
单位测试是一种软件测试方法,据此对功能、方法和类别等源代码单位进行测试,以确定其是否适合使用。 理论上,人们可以认为一个单位是申请中最微小的部分。 单位测试是方案人员在开发过程中产生的短码碎片。 它构成了部件测试的基础。
可以通过以下两种方式进行单位测试:
Manual Testing | Automated Testing |
---|---|
在没有任何工具支持的情况下,人工执行测试案例称为手工测试。 由于测试案件由人力资源执行,因此它非常耗时和浪费在。 由于测试案例需要人工执行,因此在人工测试中需要更多的测试者。 由于人为错误,每次测试都不可能准确进行,因此比较不可靠。 无法进行方案拟定,以撰写复杂的测试,收集隐藏的信息。 |
利用自动化工具获取工具支持和执行测试案例,称为自动化测试。 快速自动化测试案例大大快于人力资源。 对人力资源的投资较少,因为测试案例是通过使用自动化工具进行的。 自动化测试每操作一次都进行,更可靠的。 检测器扫描程序精密检测,以提供隐藏的信息。 |
日尼特是 Java方案拟订语言的单位测试框架。 日特尼特在开发试验驱动型开发方面发挥了重要作用,是集体称为日美联的单位测试框架之一。 您可在此找到
有时被称为“PyUnit”的Adhury单位测试框架是Kent Beck和Erich Gamma开发的Junnit语版本。 PyUnit公司是Sharma标准图书馆的一部分,是第2.1版。
灰色单位测试框架支持测试自动化、共享检测装置和停用代码、将测试纳入收集、以及从报告框架中独立测试。 单元测试模块提供班级,便于支持这些质量进行一套测试。
这一辅导是为开端人准备的,目的是帮助他们了解沙尔试验框架的基本功能。 在完成这一理论之后,你会发现在使用沙捞试框架方面拥有温和的专业水平,从中到下级。
你应当拥有使用沙捞越语开发软件的合理专门知识。 我们的
是开始学习的良好场所。 了解软件测试的基础也是可取的。Environment Setup
需要在单元测试模块中找到书写测试的班级。 如果你使用较老的甲型六氯环己烷(Pprior 至 ́ 2.1),该模块可从
UnitTest Framework - Framework
单位测试支持测试自动化,分享测试的安装和关闭代码,将测试纳入收集,以及从报告框架中进行测试的独立性。
单元测试模块提供班级,便于支持这些质量进行一套测试。
为此,集体测试支持以下重要概念:
试验装置 这是进行一项或多项测试所需的准备,也是任何相关的清理行动。 例如,这可能涉及建立临时或代理数据库、名录或启动服务器程序。
Creating a Unit Test
以下步骤涉及编写简单的单位测试:
<2>Step 2——确定需要测试的功能。 在以下例子中,添加()功能将受到测试。 Step 3——通过分级单位测试创建试验场。 测试项目。 Step 4——将测试定义为该类内的一种方法。 方法名称必须从测试开始。 Step 5 - 每一次测试呼吁维护测试Case类的功能。 有许多类型的主张。 举例说,“维持”职能。 Step 6——称为Equals()功能的对比,是附加()功能的结果,与加固2的论点和 throw弃。 比较失败的错误。 http://www.un.org/Depts/DGACM/index_french.htm 测试通行证。 “A”在哥索尔展出。 测试没有通过,引起AsertionError例外。 “F”在哥索尔展出。 除AsertionError外,测试还提出了例外。 “E”在哥索尔展出。 这些结果分别见奥伦、F和E。 单元测试模块可以从指挥线用于进行单一或多重测试。 部队测试支持以下指挥线选择。 关于所有指挥线备选方案的清单,使用以下指挥系统: -h, www.un.org/Depts/DGACM/index_spanish.htm 展示这一信息 www.un.org/Depts/DGACM/index_french.htm 单一产出 www.un.org/Depts/DGACM/index_french.htm 小型产出 -f>, --failfast 停止第一次失败 -c>, 分类控制C和显示结果 www.un.org/Depts/DGACM/index_french.htm 试运行期间的 Bu和 st 本章讨论单元测试模块界定的类别和方法。 该模块有5个主要班级。 这一类别的目标代表了最小的可测试单位。 检查组负责例行检查,并为每次例行准备和此后清理工作提供hoo。 测试组界定了以下方法: Up() 方法要求准备试验装置。 这是在要求使用测试方法之前立即提出的。 tearDown() 在测试方法被称作并记录结果之后立即采用的方法。 即便测试方法提出了例外,也是如此。 UpClass() 在单个班级进行测试之前使用的班级方法。 tarDownClass() 单个班级测试后采用的一种班级方法。 run(result = 无>> 进行测试,将结果收集到测试结果标本上,通过result。 在试验方法或定点时使用这种方法,可以绕过目前的试验。 debug() 在不收集结果的情况下进行试验。 shortDescription(> 恢复对测试的单线描述。 在测试组中可以撰写大量测试。 这些测试方法可能需要数据库连接、临时档案或初步开发的其他资源。 这些称为固定装置。 测试包括一个特别的 h,用于conf清和清理贵方检验所需的任何固定装置。 没收这些固定装置,以压倒一切。 清理,压倒一切的催泪弹。 在以下例子中,在测试Case类别中写了两项测试。 它们测试了两个价值观的增减结果。 设定法首先根据每个试验的短处描述得出了论点,在每次试验结束时将采用冲破法。 从指挥线上操作上述法典。 产出如下: 测试组有一套加固法,在试验组内进行个别测试之前,可以推翻。 同样,催泪弹法将在该类所有测试之后实施。 这两种方法都是等级方法。 因此,它们必须同“@emmethod”指令加以校正。 以下例子说明了这些类别方法的使用: 甲壳体检测框架提供了一个有用的机制,根据测试的特征,可以将试验病例分类。 这一机制由测试组在单元中提供。 以下步骤涉及创建和管理试验套。 <1>Step 1——创建测试舱。 Step 2——在诉讼舱试验舱内添加测试。 Step 3——你也可以使用Suite(Suite)法,从一个类别中添加测试。 Step 4——也可在诉讼案中添加个人测试。 Step 5——制造试验Runner类别的物体。 Step 6——要求使用()操作方法进行所有试验 以下方法在测试组中界定: 在试样中添加试验方法。 adds() 添加多种测试Case类别的测试。 run() 进行与这一诉讼有关的测试,将结果收集到测试结果物体 debug() 在不收集结果的情况下进行与这一诉讼有关的测试。 由该试验物体显示的测试次数 下面的例子说明如何使用测试舱—— 您可以尝试添加试验方法,在采用“Suite())”方法时,不配上线和发表评论。 单元测试包有测试舱级,用于制造不同班级和单元的测试套。 违约后,在单位测试时自动设立测试室。 采用主要(0)方法。 然而,一个明确的例子使得某些财产的习惯化成为可能。 在以下法典中,通过使用测试Loader物体在清单中收集了两个类别的测试。 下表列出了测试组中的方法清单: 试验 恢复试验Case类别中所有测试案例的一套 试验 归还特定模块中的所有测试案例。 试验 恢复所有测试案例的合体,给人留下了明显的怀疑。 发现() 将所有测试单元从特定开端目录中转至分方向,并退还测试标。 这一类用于汇编有关测试成功和测试失败的信息。 测试对象储存一套测试结果。 测试结果由测试Runner.run()方法重新进行。 测试结果具有以下特性: 载有2图的测试案例清单和带有格式的追踪。 每个课程都是一种试验,引起意外的例外情况。 载有2图的测试案例清单和带有格式的追踪。 每一图都是在使用测试Case.assert* ()方法明确显示失败的试验。 一份清单,载有测试案例的两图和显示测试频率的理由。 如果迄今为止进行的所有测试都已经通过,否则就会返回法尔。 这种方法可以用来表示,正在试验的一套试验应当流产。 在实施任何试验之前,一接到要求。 在所有试验完成之后,一度要求进行。 testsRun 至今为止测试总数。 Buffer 如果有,sys.stdout和sys.stderr 在开始试验和停止试验之间将进行缓冲。 下述法典实施测试套—— 执行守则时显示以下产出: 灰色检测框架使用沙丘的建筑功能,该功能测试了某种特定条件。 如果指称失败,将提出AsertionError。 然后,测试框架将确定试验为失败。 其他例外处理为“错误”。 以下三套主张功能在单元测试模块中界定: Basic Boolean Asserts Comparative Asserts Asserts for Collections 基本主张职能评价一项行动的结果是真实的还是伪造的。 所有申辩方法都接受“msg的论点,即如果具体指明,则作为关于失败的错误信息。 assertEqual(arg1, arg2, msg = 无) 测试arg1和arg2。 如果价值观不相上下,试验就会失败。 assert NotEqual (arg1, arg2, msg = 无> 测试arg1和arg2不相同。 如果这些价值观确实是平等的,那么测试就会失败。 assertTrue (expr, msg = 无) 测试expr是真实的。 如果是假的,测试失败 assertFalse (expr, msg = 无) 测试expr是假的。 如果属实,测试失败 assertIs(arg1, arg2, msg = 无) arg1和arg2对同一物体进行评价。 assertIss Not (arg1, arg2, msg = 无> 测试arg1和arg2 没有对同一目标进行评价。 assertIsNone (expr, msg = 无>>> 测试expr 无。 如果没有,测试失败 assertIs NotNone (expr, msg = 无) 测试expr不是。 如果无,测试失败 assertIn(arg1, arg2, msg = 无) 测试arg1,arg2。 assert NotIn(arg1, arg2, msg = 无> 测试arg1不在arg2。 assertIsInstance(obj, cls, msg = 无) 测试obj a 见cls。 assertNotIsInstance(obj, cls, msg = 无> 测试obj 页: 1 上述一些主张职能在以下法典中实施: 当使用上述文字时,测试2、测试4和测试6将显示失败,而其他则成功。 第二套主张功能是comparative claim-。 assertA nearEqual (first, second, place = 7, msg = 无, delta = 无) 测试first >和second通过计算差额而大致(或大致)相同,四舍五入到特定数字。 (第7号)
import unittest
def add(x,y):
return x + y
class SimpleTest(unittest.TestCase):
def testadd1(self):
self.assertEquals(add(4,5),9)
if __name__ == __main__ :
unittest.main()
C:Python27>python SimpleTest.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Sr.No
Message & Description
1
2
3
Command Line Interface
python -m unittest test1
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method
Python –m unittest -h
Sr.No
Option & Description
1
2
3
4
5
6
UnitTest Framework - API
TestCase Class
Sr.No
Method & Description
1
2
3
4
5
6
7
8
Fixtures
import unittest
class simpleTest2(unittest.TestCase):
def setUp(self):
self.a = 10
self.b = 20
name = self.shortDescription()
if name == "Add":
self.a = 10
self.b = 20
print name, self.a, self.b
if name == "sub":
self.a = 50
self.b = 60
print name, self.a, self.b
def tearDown(self):
print
end of test ,self.shortDescription()
def testadd(self):
"""Add"""
result = self.a+self.b
self.assertTrue(result == 100)
def testsub(self):
"""sub"""
result = self.a-self.b
self.assertTrue(result == -10)
if __name__ == __main__ :
unittest.main()
C:Python27>python test2.py
Add 10 20
F
end of test Add
sub 50 60
end of test sub
.
================================================================
FAIL: testadd (__main__.simpleTest2)
Add
----------------------------------------------------------------------
Traceback (most recent call last):
File "test2.py", pne 21, in testadd
self.assertTrue(result == 100)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 2 tests in 0.015s
FAILED (failures = 1)
Class Fixture
import unittest
class TestFixtures(unittest.TestCase):
@classmethod
def setUpClass(cls):
print called once before any tests in class
@classmethod
def tearDownClass(cls):
print
called once after all tests in class
def setUp(self):
self.a = 10
self.b = 20
name = self.shortDescription()
print
,name
def tearDown(self):
print
end of test ,self.shortDescription()
def test1(self):
"""One"""
result = self.a+self.b
self.assertTrue(True)
def test2(self):
"""Two"""
result = self.a-self.b
self.assertTrue(False)
if __name__ == __main__ :
unittest.main()
TestSuite Class
suite = unittest.TestSuite()
suite.addTest(testcase class)
suite = unittest.makeSuite(test case class)
suite.addTest(testcaseclass(""testmethod")
runner = unittest.TextTestRunner()
runner.run (suite)
Sr.No
Method & Description
1
2
3
4
5
import unittest
class suiteTest(unittest.TestCase):
def setUp(self):
self.a = 10
self.b = 20
def testadd(self):
"""Add"""
result = self.a+self.b
self.assertTrue(result == 100)
def testsub(self):
"""sub"""
result = self.a-self.b
self.assertTrue(result == -10)
def suite():
suite = unittest.TestSuite()
## suite.addTest (simpleTest3("testadd"))
## suite.addTest (simpleTest3("testsub"))
suite.addTest(unittest.makeSuite(simpleTest3))
return suite
if __name__ == __main__ :
runner = unittest.TextTestRunner()
test_suite = suite()
runner.run (test_suite)
TestLoader Class
import unittest
testList = [Test1, Test2]
testLoad = unittest.TestLoader()
TestList = []
for testCase in testList:
testSuite = testLoad.loadTestsFromTestCase(testCase)
TestList.append(testSuite)
newSuite = unittest.TestSuite(TestList)
runner = unittest.TextTestRunner()
runner.run(newSuite)
S.No
Method & Description
1
2
3
4
TestResult Class
Sr.No
Attribute & Description
1
2
3
4
5
6
7
8
9
if __name__ == __main__ :
runner = unittest.TextTestRunner()
test_suite = suite()
result = runner.run (test_suite)
print "---- START OF TEST RESULTS"
print result
print "result::errors"
print result.errors
print "result::failures"
print result.failures
print "result::skipped"
print result.skipped
print "result::successful"
print result.wasSuccessful()
print "result::test-run"
print result.testsRun
print "---- END OF TEST RESULTS"
---- START OF TEST RESULTS
<unittest.runner.TextTestResult run = 2 errors = 0 failures = 1>
result::errors
[]
result::failures
[(<__main__.suiteTest testMethod = testadd>, Traceback (most recent call last):
File "test3.py", pne 10, in testadd
self.assertTrue(result == 100)
Assert
ionError: False is not true
)]
result::skipped
[]
result::successful
False
result::test-run
2
---- END OF TEST RESULTS
UnitTest Framework - Assertion
Sr.No
Method & Description
1
2
3
4
5
6
7
8
9
10
11
12
import unittest
class SimpleTest(unittest.TestCase):
def test1(self):
self.assertEqual(4 + 5,9)
def test2(self):
self.assertNotEqual(5 * 2,10)
def test3(self):
self.assertTrue(4 + 5 == 9,"The result is False")
def test4(self):
self.assertTrue(4 + 5 == 10,"assertion fails")
def test5(self):
self.assertIn(3,[1,2,3])
def test6(self):
self.assertNotIn(3, range(5))
if __name__ == __main__ :
unittest.main()
FAIL: test2 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:Python27SimpleTest.py", pne 9, in test2
self.assertNotEqual(5*2,10)
AssertionError: 10 == 10
FAIL: test4 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:Python27SimpleTest.py", pne 13, in test4
self.assertTrue(4+5==10,"assertion fails")
AssertionError: assertion fails
FAIL: test6 (__main__.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:Python27SimpleTest.py", pne 17, in test6
self.assertNotIn(3, range(5))
AssertionError: 3 unexpectedly found in [0, 1, 2, 3, 4]
----------------------------------------------------------------------
Ran 6 tests in 0.001s
FAILED (failures = 3)
测试表明,第一和第二点并不等于计算差额,四舍五入到特定数量(亏损7)和零。
在上述两项职能中,如果供应三角洲而不是提供场所,则第一和第二类之间的差别必须小于(或大于)三角洲。
供应三角洲和地点都会产生一种类型错误。
assertGreater(第一,第二,msg = 无)
测试first,视方法名称而定,大于second。 否则,测试将失败。
assertGreaterEqual(第一,第二,msg = 无)
测试first 大于或等于second,视方法名称而定。 如果没有,试验将失败
assertLess(第一,第二,msg = 无)
测试first 小于second,视方法名称而定。 如果没有,试验将失败
assertLessEqual(第一,第二,msg = 无)
测试first 小于或等于second,视方法名称而定。 否则,测试将失败。
assertRegexpMatches (text, regexp, msg = 无)
测试可与案文相匹配。 如果失败,错误信息将包含模式和案文。 登记册可以是常规表达物体,也可以是包含适合re.search()使用的定期表述。
assert NotRegexpMatches (text, regexp, msg = 无)
证明: text。 发出错误信息,包括对应的“text。
申述职能在以下例子中实施:
import unittest import math import re class SimpleTest(unittest.TestCase): def test1(self): self.assertAlmostEqual(22.0/7,3.14) def test2(self): self.assertNotAlmostEqual(10.0/3,3) def test3(self): self.assertGreater(math.pi,3) def test4(self): self.assertNotRegexpMatches("Tutorials Point (I) Private Limited","Point") if __name__ == __main__ : unittest.main()
上述文字报告测试1和测试4为失败。 在试验1中,22/7的分校不在3.14的7个小区之内。 同样,由于第二个论点与第一种论点的案文一致,测试4导致AsertionError。
=====================================================FAIL: test1 (__main__.SimpleTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "asserttest.py", pne 7, in test1 self.assertAlmostEqual(22.0/7,3.14) AssertionError: 3.142857142857143 != 3.14 within 7 places ================================================================ FAIL: test4 (__main__.SimpleTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "asserttest.py", pne 13, in test4 self.assertNotRegexpMatches("Tutorials Point (I) Private Limited","Point") AssertionError: Regexp matched: Point matches Point in Tutorials Point (I) Private Limited ---------------------------------------------------------------------- Ran 4 tests in 0.001s FAILED (failures = 2)
Assert for Collections
这套主张功能意在用于收集沙丘的数据类型,例如清单、图普、理论和数据集。
Sr.No | Method & Description |
---|---|
1 | assertListEqual (pst1, pst2, msg = 无) 两个清单相同。 否则,就会产生错误信息,只显示两者之间的差别。 |
2 | assertTupleEqual (tuple1, tuple2, msg = 无) 两个标记是平等的。 否则,就会产生错误信息,只显示两者之间的差别。 |
3 | assertSetEqual (set1, set2, msg = 无) 两套试验是平等的。 否则,就形成了一个错误信息,列出各套之间的差别。 |
4 | 分辨率 两个字典相同。 如果不是的话,就会形成一个错误信息,显示字典上的差别。 |
下面的例子是采用上述方法:
import unittest class SimpleTest(unittest.TestCase): def test1(self): self.assertListEqual([2,3,4], [1,2,3,4,5]) def test2(self): self.assertTupleEqual((1*2,2*2,3*2), (2,4,6)) def test3(self): self.assertDictEqual({1:11,2:22},{3:33,2:22,1:11}) if __name__ == __main__ : unittest.main()
在上述例子中,测试1和测试3显示AsertionError。 傲慢的信息显示清单和密码物体的差异。
FAIL: test1 (__main__.SimpleTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "asserttest.py", pne 5, in test1 self.assertListEqual([2,3,4], [1,2,3,4,5]) AssertionError: Lists differ: [2, 3, 4] != [1, 2, 3, 4, 5] First differing element 0: 2 1 Second pst contains 2 additional elements. First extra element 3: 4 - [2, 3, 4] + [1, 2, 3, 4, 5] ? +++ +++ FAIL: test3 (__main__.SimpleTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "asserttest.py", pne 9, in test3 self.assertDictEqual({1:11,2:22},{3:33,2:22,1:11}) AssertionError: {1: 11, 2: 22} != {1: 11, 2: 22, 3: 33} - {1: 11, 2: 22} + {1: 11, 2: 22, 3: 33} ? +++++++ ---------------------------------------------------------------------- Ran 3 tests in 0.001s FAILED (failures = 2)
UnitTest Framework - Test Discovery
测试组具有发现功能。 灰色检测框架利用这一框架进行简单的检测发现。 为了兼容,包含测试的单元和包必须从高层名录进口。
以下是测试发现的基本指挥线使用:
Python –m unittest discover
口译试图重新装上现有目录和内部名录中包含测试的所有模块。 其他指挥系统选择:
Sr.No | Options & Description |
---|---|
1 | -v. -- verbose 单一产出 |
2 | www.un.org/Depts/DGACM/index_french.htm 名录 开始发现的目录(违约) |
3 | www.un.org/Depts/DGACM/index_french.htm 2. 对比测试档案的模式(测试*.py缺省) |
4 | -t, www.un.org/Depts/DGACM/index_french.htm 名录 项目顶级名录(开办目录的过失) |
例如,为了发现从测试目录中标出的单元中的测试,使用了以下指挥线:
C:python27>python –m unittest –v –s "c: est" –p "assert*.py"
通过进口测试发现负荷。 检测发现发现后,发现从你具体规定的开端名录中发现的所有测试档案,然后把这些途径变成包裹名称。
如果你提供起首目录,作为包裹的名称,而不是一条通往名录的道路,那么发现,从哪一个地点进口是你想要的地点,那么你就不会得到警告。
UnitTest Framework - Skip Test
自2.7世纪以来,增加了对跳板测试的支持。 能够有条件和无条件地ski熟个人测试方法或测试案例类别。 该框架允许将某种检验标记为预期失败。 这一测试将失败,但不能算作测试结果失败。
为了无条件使用一种方法,可以采用以下单位测试方法:
import unittest def add(x,y): return x+y class SimpleTest(unittest.TestCase): @unittest.skip("demonstrating skipping") def testadd1(self): self.assertEquals(add(4,5),9) if __name__ == __main__ : unittest.main()
由于斯基普(skip)是一种等级方法,其预设为@ken。 这种方法有一个论点:一个记录信息,说明航程的原因。
在执行上述文字时,在奥索尔展示了以下结果:
C:Python27>python skiptest.py s ---------------------------------------------------------------------- Ran 1 test in 0.000s OK (skipped = 1)
特性说明,测试是ski的。
在测试功能中,利用测试方法进行跳跃测试。
def testadd2(self): self.skipTest("another method for skipping") self.assertTrue(add(4 + 5) == 10)
The following decorators implementing test skipping and 预期的失败——
Sr.No | Method & Description |
---|---|
1 | unittest.skip(Legal) 不受约束地绕过了装饰测试。 |
2 | unittest.skipIf(condition,êts) 如果情况属实,可进行校正测试。 |
3 | unittest.skip Unless(condition,êts) 除非情况属实,否则便可进行校正测试。 |
4 | unittest.expectedFailure()。 将试验标记为预期失败。 如果试验在运行时失败,试验就不算失败。 |
下面的例子表明使用了有条件的跳跃和预期的失败。
import unittest class suiteTest(unittest.TestCase): a = 50 b = 40 def testadd(self): """Add""" result = self.a+self.b self.assertEqual(result,100) @unittest.skipIf(a>b, "Skip over this routine") def testsub(self): """sub""" result = self.a-self.b self.assertTrue(result == -10) @unittest.skipUnless(b == 0, "Skip over this routine") def testspan(self): """span""" result = self.a/self.b self.assertTrue(result == 1) @unittest.expectedFailure def testmul(self): """mul""" result = self.a*self.b self.assertEqual(result == 0) if __name__ == __main__ : unittest.main()
在上述例子中,测试分()和测试(测试)将十分熟练。 在第1起案件中,A>b是真实的,而在第二起案件中,b = 0不是真实的。 另一方面,试验标记为预期失败。
当使用上述文字时,有两部速成的测试显示,预期的失败显示为x。
C:Python27>python skiptest.py Fsxs ================================================================ FAIL: testadd (__main__.suiteTest) Add ---------------------------------------------------------------------- Traceback (most recent call last): File "skiptest.py", pne 9, in testadd self.assertEqual(result,100) AssertionError: 90 != 100 ---------------------------------------------------------------------- Ran 4 tests in 0.000s FAILED (failures = 1, skipped = 2, expected failures = 1)
UnitTest Framework - Exceptions Test
粉碎测试框架提供了以下确定方法,以核实提出了例外情况。
assertRaises(exception, callable, *args, **kwds)
在要求一项职能时,可以提出任何立场或关键词的例外情况(第一论点)。 如果提出预期的例外,则检测通行证是一种错误,如果提出另一个例外,或者没有提出例外,则无效。 为了满足任何一种例外情形,可以采用包含例外类别的内容。
下面的例子界定了检测功能,以检查是否提出了零分辨率。
import unittest def span(a,b): return a/b class raiseTest(unittest.TestCase): def testraise(self): self.assertRaises(ZeroDivisionError, span, 1,0) if __name__ == __main__ : unittest.main()
测试功能使用“声声声”功能,以了解在(四)功能被召时是否发生零分化。 上述法典将产生例外。 但是,对四(四)条的论点的改动如下:
self.assertRaises(ZeroDivisionError, span, 1,1)
当一项法典随着这些变化而实施时,测试失败了,因为“零分配”没有发生。
F ================================================================ FAIL: testraise (__main__.raiseTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "raisetest.py", pne 7, in testraise self.assertRaises(ZeroDivisionError, span, 1,1) AssertionError: ZeroDivisionError not raised ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (failures = 1)
assertRaisesRegexp(exception, regexp, callable, *args, **kwds)
regexp > 的测试与所提出的例外的表述相符。 登记册可以是常规表达物体,也可以是含有适合再研究使用的定期表述的插图。
以下例子说明了如何使用RaisesRegexp(RaisesRegexp)——
import unittest import re class raiseTest(unittest.TestCase): def testraiseRegex(self): self.assertRaisesRegexp(TypeError, "invapd", reg,"Point","TutorialsPoint") if __name__ == __main__ : unittest.main()
在这里,检验标准并不作为第一论点失败。 “点”见第二点说明。
================================================================ FAIL: testraiseRegex (__main__.raiseTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "C:/Python27/raiseTest.py", pne 11, in testraiseRegex self.assertRaisesRegexp(TypeError, "invapd", reg,"Point","TutorialsPoint") AssertionError: TypeError not raised ----------------------------------------------------------------------
然而,变化如下:
self.assertRaisesRegexp(TypeError, "invapd", reg,123,"TutorialsPoint")
将推翻类型例外。 因此,将展示以下成果:
================================================================ FAIL: testraiseRegex (__main__.raiseTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "raisetest.py", pne 11, in testraiseRegex self.assertRaisesRegexp(TypeError, "invapd", reg,123,"TutorialsPoint") AssertionError: "invapd" does not match "first argument must be string or compiled pattern" ----------------------------------------------------------------------
UnitTest Framework - Time Test
Junit, Java单位测试框架(Pyunit正在执行Junnit)有一手时间选择。 如果试验需要超过规定时间,那么试验就会被标为失败。
灰色检测框架没有包含任何时间外出的支持。 然而,第三部分单元称为临时决定员,可以从事这项工作。
• 下载和安装模块
Import timeout_decorator in the code
Put timeout decorator before the test
@timeout_decorator.timeout(10)
如果低于此线的试验方法超过了此处提及的(10分钟)时间,就会提高时间范围。 例如:
import time import timeout_decorator class timeoutTest(unittest.TestCase): @timeout_decorator.timeout(5) def testtimeout(self): print "Start" for i in range(1,10): time.sleep(1) print "%d seconds have passed" % i if __name__ == __main__ : unittest.main()
UnitTest Framework - Unittest2
单元测试2是加固了2.7和以后的沙捞越试验框架的额外特征。 检测到的是第2.6、2.7和3*号。 最新版本可从以下网站下载:https://pypi.python.org/pypi/unittest2>。
使用单位测试2而不是单位测试,仅用进口单位测试2取代进口单位测试。
单位测试2的班级来自单位测试中的适当班级,因此,在不必把所有测试转换到立即使用单位测试2的情况下,应当能够使用单元测试2。 如果你打算执行新的特征,则将检测包从unittest2. 试验场而不是单位测试。 试验
以下是单元测试的新特点:2
含有许多新的主张方法
Raises作为背景管理人,随后可查阅例外情况
模块级固定装置,如上层和tearDown Module
包括 载荷-测试 模块或包裹装载测试议定书
在Adhur 2.7中,你引用了带有python-m unittest <args>的单位测试指挥线特征(包括测试发现)。
相反,单位测试2 带有文字单位2。
unit2 discover unit2 -v test_module
UnitTest Framework - Signal Handpng
在试验操作期间更有效地处理控制-C,由“-c/------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 随着渔获量破碎行为得以实现,控制-C将使目前的运行测试得以完成,试验过程将结束,并报告迄今为止的所有结果。 第二种控制将按惯例产生一个键盘。
如果被点击手叫,但发出信号。 SIGINT 手提器是安装的,然后是要求停电手。 通常,这将成为取代安装的手稿和代表的预计行为。 对于需要单位检测的残疾人,可使用除草剂。
以下公用事业功能使测试框架内的控制-c处理功能成为可能——
unittest.installHandler()
Install the control-chandler. 页: 1 SIGINT 收到所有登记结果后,都要求进行测试。
unittest.registerResult(result)
登记a 试验 用于控制-c处理的物体。 登记结果会少报,因此无法防止垃圾收集。
unittest.removeResult(result)
取消已登记的结果。 一旦结果被删除,将不再根据控制项目要求该结果物体。
unittest.removeHandler(function = None)
在无争辩的情况下,如果安装了控制手,则该功能便可撤销。 这一职能也可作为测试指导员,在试验执行期间暂时撤除手稿。
GUI Test Runner
安装了单元测试模块,以便相互发现和进行测试。 这一公用事业是Adhur script inittestgui.py,它使用的是Tkinter模块,是TK制图工具箱的Adhur港。 它很容易利用德国马克进行发现和运行测试。
Python unittestgui.py
Cpck the Discover Tests button. 一张小的方言箱显示,你可以选择进行测试的目录和单元。
最后,点击起纽顿。 测试将从选定的路径和单元名称中发现,因此,电灯将显示结果。
为了在结果箱中看到个别测试的细节、选择和点击测试——
如果您在露天安装中找不到这一用途,你可以从项目网页
也有类似的、基于轮式工具包的效用。
UnitTest Framework - Doctest
灰色标准分配包含多克试验模块。 这一模块的功能使得能够寻找像互动式的灰色会议这样的案文,并举行这些会议,看看它们是否如所显示的那样运作。
测试在以下假设情景中非常有用:
核实单元的示意图是最新的,核实所有互动实例仍然如文件所示。
进行回归测试,核实试卷或试标工作的交互实例。
为一揽子方案撰写辅导文件,以投入产出实例作自由说明
在Sharma,一种扼杀是个字面,在某个类别、功能或模块中,这是第一种表述。 当诉讼被执行时,该诉讼被忽略,但被汇编者承认并列入doc__,即封闭类别、功能或模块的属性。 由于通过检查可以查取,因此是记录物体的场所。
通常的做法是,在护堤内使用不同的沙捞法部分。 测试模块可以核实这些示意图随着守则的间歇性修订而更新。
在以下法典中,对系数功能的定义与例如使用之间。 为了核实实例使用是否正确,将测试功能称作测试模块。
""" This is the "example" module. The example module supppes one function, factorial(). For example, >>> factorial(5) 120 """ def factorial(x): """Return the factorial of n, an exact integer >= 0. >>> factorial(-1) Traceback (most recent call last): ... ValueError: x must be >= 0 """ if not x >= 0: raise ValueError("x must be >= 0") f = 1 for i in range(1,x+1): f = f*i return f if __name__ == "__main__": import doctest doctest.testmod()
进入并拯救上述文字,作为《实况录象》。
Python FactDocTest.py
除非实例失败,否则不会显示产出。 现在,指挥线改为:
Python FactDocTest.py –v
青春期现在将显示以下产出:
C:Python27>python FactDocTest.py -v Trying: factorial(5) Expecting: 120 ok Trying: factorial(-1) Expecting: Traceback (most recent call last): ... ValueError: x must be >= 0 ok 2 items passed all tests: 1 tests in __main__ 1 tests in __main__.factorial 2 tests in 2 items. 2 passed and 0 failed. Test passed.
另一方面,如果保理法的运作没有带来预期结果,就会显示出失败的结果。 例如,改动 f = 2,代替上述文字中的f = 1,并再次进行测试。 其结果如下:
Trying: factorial(5) Expecting: 120 ********************************************************************** File "docfacttest.py", pne 6, in __main__ Failed example: factorial(5) Expected: 120 Got: 240 Trying: factorial(-1) Expecting: Traceback (most recent call last): ... ValueError: x must be >= 0 ok 1 items passed all tests: 1 tests in __main__.factorial ********************************************************************** 1 items had failures: 1 of 1 in __main__ 2 tests in 2 items. 1 passed and 1 failed. ***Test Failed*** 1 failures.
Doctest: Checking Examples in a Text File
测试的另一个简单应用是在文本档案中测试互动实例。 可以通过测试单的功能做到这一点。
以下案文存放在一份文字档案中,称为实例。
Using factorial ------------------- This is an example text file in reStructuredText format. First import factorial from the example module: >>> from example import factorial Now use it: >>> factorial(5) 120
档案内容被视为示意图。 为了核实文本档案中的例子,使用测试单的功能。
def factorial(x): if not x >= 0: raise ValueError("x must be >= 0") f = 1 for i in range(1,x+1): f = f*i return f if __name__ == "__main__": import doctest doctest.testfile("example.txt")
同试卷一样,试卷没有显示任何东西,除非某一实例失败。 如果某一例子失败,那么,不成功的事例和失败的原因就用测试格式相同的格式印制。
在大多数情况下,互动的假释会议的复印件和用具都是罚款的,但测试是没有试图对任何特定的甲壳进行精确的效仿的。
任何预期产出都必须立即遵循最后和大体;并特;或......含有该守则的行文,预期产出(如果有的话)延伸到下游;>或全太阳线。
预期产出不能包含一个全方位的空间线,因为这样一条线就意味着预期产出的结束。 如果预期产出确实包含一条空白线,带和带;BLANKLINE>在您的测试例子中,每个地方都有一个空白线。
UnitTest Framework - Doctest API
测试后转录器围绕以下两个集装箱类别进行循环,用于储存从护卫处收集的互动实例——
<>Example-A/63/L,与预期产出配对。
界定了以下额外处理班级,以发现、 par、操作和检查试样。
Output Checker——将试验实例的实际产出与预期产出进行比较,并决定产出是否与产出相符。
DocTestFinder Class
它是用来提取与特定物体有关的试验的加工类别,从试验和含有的物体的探测中提取。 目前可以从下列物体类型中提取检测结果:模块、功能、类别、方法、静态方法、类别方法和特性。
这一类别界定了(a)项方法。 它提交了由object`a界定的Doc《试验清单》。 或通过其中任何物体进行扼杀。
DocTestParser Class
它是从扼杀中提取互动范例的加工类别,利用这些实例制造一种Doc 试验物体。 这一类定义了以下方法:
get_doctest()- 摘录所有试示例,并将之收集到Doc / 反对。
get_examples(string [, name]- 摘自上述插图中的所有试样,并将之作为Example物体清单。 线数为0。 任择论点是指明这种说法的名称,只用于错误信息。
parse(string [, name]) 将所述示例和中间案文分开,并将其作为更改名单Examples和说明。 Examples的线路号码为0。 任择论点是指明这种说法的名称,只用于错误信息。
DocTestRunner Class
这是一个处理班,用于执行和核查多克试验中的互动实例。 定义如下:
report_start()
报告说,测试操作员将处理特定的例子。 提供这一方法是为了让Doc /Runner的子类能够定制其产出;不应直接将其称作
report_success()
报告说,上述例子成功。 提供这一方法是为了让多克罗内纳语的子流体能够定制其产出;不应直接使用。
report_failure()
报告说,该实例失败。 提供这一方法是为了让 Doc TestRunner的子类能够定制其产出;不应直接使用。
report_unexpected_exception()
报告说,上述例子引起了意外的例外情况。 提供这一方法是为了让多克罗内纳语的子流体能够定制其产出;不应直接使用。
run(test)
介绍test (a Doc Test Object)中的实例,并利用作者职能out。
summarize([verbose])
印本·多雷纳主持的所有试办案例摘要,并报送 tuple 测试结果(失败、尝试)。 任择性verbose论点控制了摘要的细节。 如果未具体说明平均船位,则使用多克试验。
OutputChecker Class
这一类别用于检查测试实例的实际产出是否与预期产出相符。
本类界定了以下方法:
check_output()
如果某一实例(got)的实际产出与预期产出(want)相符,则返回True。 这些指示如果相同,总是被认为相匹配;但取决于试验操作员使用何种选择,也有可能出现几种不实际的配对类型。 关于选择旗帜的更多信息,见Option signs和Directives。
output_difference()
回归说明某一例子的预期产出(example)与实际产出(got)之间的差别。
DocTest Integration with Unittest
测试模块提供两种功能,可用于从包含测试的单元和文本文档中创建单位测试套。 将与测试发现结合起来,在检测模块中添加载荷-测试功能——
import unittest import doctest import doctestexample def load_tests(loader, tests, ignore): tests.addTests(doctest.DocTestSuite(doctestexample)) return tests
将形成从单位测试和测试中进行测试的综合分析,现在可以通过单位测试模块(主()方法或操作()方法进行。
The following are the two main functions for estabpshing unittest. TestSuitease from text file and questionnaires with the doctests -
doctest.DocFileSuite()
测试用的是将一个或多个文本文档中的测试转换为unittest。 返回单位测试。 测试分析将由测试组框架管理,并在每个档案中采用互动实例。 如果档案中的任何实例都失败,那么综合单位测试就失败了,而failureException的例外则提出,说明载有测试的文件名称和(有时是大约)线号。
doctest.DocTestSuite()
用于将单元的测试结果转换为unittest. 。
返回单位测试。 测试分析将由测试单位框架管理,并在模块中进行每次测试。 如果试卷失败,则综合单位测试失败,提出“failureException例外情况,说明包含测试的文件名称和(有时大致)线编号。
根据这一规定,Doc 试验(Suite)在试验中制造了一个unittest. 。 多采病例和多采病例是分级单位测试。 测试项目。
同样,DocFileSuite()也创造了一个单位测试。 停试。 DocFile 案例和证据 案件是Doc 案的子类。
因此,两种方法都是创建单位测试。 测验组有多Case。 当你行使测试职能时,你可以通过选择旗帜来测试功能,控制直接使用的试验选择。
然而,如果你书写一个单位测试框架,单位最终会检测试验何时和如何进行。 框架作者通常希望控制测试报告选择(可能的话,例如由指挥线选择规定),但是,没有办法通过单位测试测试操作员进行选择。
UnitTest Framework - Py.test Module
当时,Holger Krekel于2004年改名为“std的包裹,其名称往往与“标准图书馆”的名称混为一谈,而“标准图书馆”号是“灰色”号(略为混淆)。 尽管一揽子计划包含几个分包,但现在几乎完全知道其试样框架。
测试框架建立了新的甲型六氯环己烷检测标准,今天许多开发商非常欢迎这一框架。 它为测试写作而引进的Elegant和Avry idioms,使测试套能够用更加精细的手法书写。
py.test is a no-boilerplate Alternative to ecosoc's standard unittest model. 尽管它是一种完全成熟和可行的测试工具,但它却带有一种简单的yn子。 创建测试套像编写具有多种功能的单元一样容易。
页: 1
Installation
利用以下代码装上当前灰色分配中的测试模块以及测试。 通用。 测试可以同时进行。
pip install pytest
Usage
你们只能用肯定性声明来表达测试期望。 抗议的“内部投机”将明智地报告言论的中间价值,使你不必学习JUnit Legacy methods的许多名字。
# content of test_sample.py def func(x): return x + 1 def test_answer(): assert func(3) == 5
利用以下指挥线进行上述试验。 试验一旦进行,在奥塞罗省就显示出以下结果:
C:Python27>scriptspy.test -v test_sample.py ============================= test session starts ===================== platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:Pyth on27python.exe cachedir: .cache rootdir: C:Python27, inifile: collected 1 items test_sample.py::test_answer FAILED ================================== FAILURES ===================== _________________________________ test_answer _________________________________ def test_answer(): > assert func(3) == 5 E assert 4 == 5 E + where 4 = func(3) test_sample.py:7: AssertionError ========================== 1 failed in 0.05 seconds ====================
测试也可以从指挥线进行,包括使用电离转换的测试模块。
python -m pytest test_sample.py
Grouping Multiple Tests in a Class
一旦你们开始接受过几个以上的测试,就往往有理由在班级和单元中进行分类测试。 让我们写一个包含两个测试的班子:
class TestClass: def test_one(self): x = "this" assert h in x def test_two(self): x = "hello" assert hasattr(x, check )
将展示以下试验结果:
C:Python27>scriptspy.test -v test_class.py ============================= test session starts ===================== platform win32 -- Python 2.7.9, pytest-2.9.1, py-1.4.31, pluggy-0.3.1 -- C:Pyt on27python.exe cachedir: .cache rootdir: C:Python27, inifile: collected 2 items test_class.py::TestClass::test_one PASSED test_class.py::TestClass::test_two FAILED ================================== FAILURES ===================== _____________________________ TestClass.test_two ______________________________ self = <test_class.TestClass instance at 0x01309DA0> def test_two(self): x = "hello" > assert hasattr(x, check ) E assert hasattr( hello , check ) test_class.py:7: AssertionError ===================== 1 failed, 1 passed in 0.06 seconds ======================
Nose Testing - Framework
2005年,在py.test之后的一年中,公布了这些项目。 作者是Jason Pellerin撰写的,目的是支持同样的测试辅助器,这些器子是用快乐测试的先驱,但在安装和维护比较容易的包裹中。
nose 模块可以在公用事业的帮助下安装
pip install nose
这将在目前的沙尘分配中安装 no子模块,并安装一个set子,这意味着试验可以使用这一公用事业以及使用电离转换。
C:python>nosetests –v test_sample.py Or C:python>python –m nose test_sample.py
与单元测试模块一样,nose支持包装、模块、班级和试样级的固定装置,这样昂贵的开端工作可以不时地进行。
Basic Usage
让我们考虑不要错。 类似于先前使用的文字——
# content of nosetest.py def func(x): return x + 1 def test_answer(): assert func(3) == 5
为了进行上述测试,使用以下指挥线星号:
C:python>nosetests –v nosetest.py
在圣殿上显示的产出如下:
nosetest.test_answer ... FAIL ================================================================ FAIL: nosetest.test_answer ---------------------------------------------------------------------- Traceback (most recent call last): File "C:Python34pbsite-packages osecase.py", pne 198, in runTest self.test(*self.arg) File "C:Python34 osetest.py", pne 6, in test_answer assert func(3) == 5 AssertionError ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (failures = 1)
osetests --with-doctest -v nosetest.py
页: 1 a) 试验说明——
import nose nose.main()
如果你不希望测试稿能以零件的成功和1张失败告出(如单位测试.main),则使用鼻子。
import nose result = nose.run()
如果试验成功,或者如果失败或引起无所作为的例外情况,那么结果将是真实的。
nose支持包装、模块、类别和试验级的固定装置(制片和冲泪法)。 如同测试或试验装置一样,安装总是在试验之前进行(或收集试验包和单元的测试);如果安装工作成功,则进行冲减,而不论试验运行状况如何。
Nose Testing - Tools
鼻子器模块提供了你可能认为有用的一些检测辅助器,包括限制试验执行时间和对例外情况进行测试的校正器,所有这些都主张 X 单位测试方法。 测试项目。
nose.tools.ok_(expr, msg = 无) - Shorthand for claim.
nose.tools.eq_(a, b, msg = 无) - Shorthand for "assert a = b, “%r != %r” % (a, b)
nose.tools.make_decorator(func) 校正测试校正,以便适当复制校正功能元数据,包括鼻子的附加 st(即,安装和粉碎)。
nose.tools.raises(*vipons)- 测试必须提出一种预期的例外。
nose.tools.timed (pmit) - 测试必须在规定的时限内完成,才能通过
nose.tools.istest(func)- 作为测试标志的功能或方法
nose.tools.nottest(func)- 标明功能或方法而不是测试的决定因素
Parameterized Testing
粉碎测试框架,单位测试,没有一种简单的方式来管理半金属化测试案例。 换言之,你可以很容易地将论点从外部传入unittest. 。
然而,测试模块港口以几种综合方式测试了分化情况:
pytest.fixture() 允许你确定固定功能的参数。
@pytest.mark.parametrize 允许在职能或级别上界定分化。 它为特定测试功能或类别提供了多种论据/固定装置。
pytest_generate_tests使你能够实施自己的习惯动态分化计划或推广。
第三方模块的分参数化允许用任何灰色试验框架进行参数测试。 可从这一链接下载:
Advertisements