Python unittest 学习

import unittest

class UTest(unittest.TestCase):
    def test_upper(self):
      self.assertEqual(‘foo‘.upper(), ‘FOO‘)

  def test_isupper(self):
    self.assertTrue(‘FOO‘.isupper())
    self.assertFalse(‘Foo‘.isupper())

if __name__ == ‘__main__‘:
unittest.main()

注:

0. unnitest 是 python 自带的库,不需要额外的安装即可用

1. 测试用例 (testcase) 都是由 unittest.TestCase 类创建的,对应的 test 开头的 测试方法, 如上例的 test_upper

2. setUp() and tearDown() 方法用来定义一些初始化和清理的 指令, 这两个方法分别在 每个测试用例 开始前和结束后执行。

如果只要在所有的测试用例之前和之后只执行一次,则用 setUpClass() 和 tearDownClass()

如果所有的测试用例都需要执行的一些共同步骤可以放在setUp(), 如果做一次就对所有的测试用例生效的就放在setUpClass(),譬如登陆(coolie对所有的测试用例都可以共享)

setupClass() 和 tearDownClass() 必需加上装饰器 @classmethod, 否则会出错。 setUp() 和 tearDown() 则不用。

3. unittest.main()提供了一个测试脚本的命令行接口。

4. 其他途径运行测试用例有:

suite = unittest.TestLoader().loadTestsFromTestCase(UTest)
unittest.TextTestRunner(verbosity=2).run(suite)

5. 命令行: python -m unittest test_module.TestClass 和 python -m unittest test_module.TestClass.test_method

如上面的例子:python -m unittest UTest.UTest

python -m unittest UTest.UTest.test_upper

还可以传一个 -v 标志 来获取 更详细的测试结果:python -m unittest -v test_module

如上例: D:\Python>python -m unittest -v UTest

结果: test_isupper (UTest.UTest) ... ok

test_upper (UTest.UTest) ... ok

6. 要运行一个class 里的 所有测试用例(所有test开头的方法),有以下几种方法:

A. unittest.main() 对应的命令行 是 ptyon module.py

B. suite = unittest.TestLoader().loadTestsFromTestCase(UTest)

unittest.TextTestRunner(verbosity=2).run(suite)

对应的命令行是 python -m unittest test_module.TestClass

C. 新建一个TestSuite 实例,然后一个一个的把所有的测试用例加到这个测试集,最后通过 TextTestRunner 这个对象的run方法运行测试集

如,此方法比较繁琐,加入有50个测试用例,需要手动的把50个用例一个一个的加到TestSuite 里

suite = unittest.TestSuite()
suite.addTest(UTest(‘test_isupper‘))
suite.addTest(UTest(‘test_upper‘))
runner = unittest.TextTestRunner()
runner.run(suite)

但是,如果是class 里只有一个测试方法,但测试时需要不同的测试数据,C 的方法派上用场:

a.首先,重写TestCase类的构造函数,把input 作为构造函数的参数(由于测试方法不能传参数,所以只能在构造函数里传入需要的input),如:

def __init__(self, marketcode, stockcode, stocktype,methodName):
    super(Comparison, self).__init__(methodName)
    self.marketcode = marketcode
    self.stockcode = stockcode
    self.stocktype = stocktype

b. 然后是测试用例方法对input的引用

def test_getPriceInfo(self):
    stime = Utils.getTimestamp()
    mkt_price = ParseResponse.getMarketLastPrice(self.marketcode,self.stockcode,self.stocktype)
    position_price = ParseResponse.getPositionLastPrice(self.loginKey,self.loginCookie,self.stockcode,self.marketcode)
    self.infoDir["timestamp"] = stime
    self.infoDir["ticker"] = self.marketcode + self.stockcode
    self.infoDir["postionprice"] = position_price
    self.infoDir["marketprice"] = mkt_price
    AlertRecorder.cmpMktPosition(self.infoDir)
    print self.infoDir

c. 最后在class 外定义一个运行的方法,其中 Comparison(stockInfo[0],stockInfo[1],stockInfo[2], "test_getPriceInfo") 即是创建一个测试类示例,test_getPriceInfo为测试用例方法名,这个是 unittest.TestCase类需要的参数。

def run():
    suite = unittest.TestSuite()
    stockInfoList = Scheduler.get_mktPostion_stocks()
    for stockInfo in stockInfoList:
        suite.addTest(Comparison(stockInfo[0],stockInfo[1],stockInfo[2], "test_getPriceInfo"))
    runner = unittest.TextTestRunner()
    runner.run(suite)

综上,封装起来为:

A. .main(verbosity=2), 其中verbosity=2 是使得结果输出时更详细

B.

def run():
  suite = unittest.TestLoader().loadTestsFromTestCase(testCaseClassName)
  runner = unittest.TextTestRunner(verbosity=2)
  runner.run(suite)

C.

def run():
  suite = unittest.TestSuite()
  suite.addTest(testCaseClassName(‘test_method‘))
  runner = unittest.TextTestRunner(verbosity=2)
  runner.run(suite)

注意:上述三个运行测试的方法,在IDE上的输出结果有点差别。A 和 C 输出的结果:

set up for class

test_isupper (__main__.UTest) ... ok

test_sum (__main__.UTest) ... ok

test_upper (__main__.UTest) ... ok

而B输出结果为:

test_sum (__main__.UTest) ... ok

test_upper (__main__.UTest) ... ok

set up for class

test_isupper (__main__.UTest) ... ok

优先还是用 unittest.main() 和 unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(testCaseClassName))

7. 如果要跳过测试,则可以用到 装饰器 @unittest.skip("reason") 和 @unittest.skipIf(condition,‘reason‘). 如果是针对个别测试用例,则在 测试用例方法加装饰器。如果需要跳过所有的测试(譬如节假日)则在 setUpClass 上加装饰器。这种情况下得注意两个装饰器的先后顺序,先@classmethod 后 @unittest.skipIf()。如:

@classmethod

@unittest.skipIf(True, "To skip the test")

def setUpClass(cls):

print ‘set up for class‘

另外,setUp()也可以跳过所有的测试,不过和 setUpClass 有区别: setUpClass 是一次性跳过所有的测试,运行结果显示运行0个测试: Ran 0 tests in 0.000s OK (skipped=1)

但setUp 则是每个测试用例都跳过运行,显示结果是跑了N 个,跳过N 个:

test_isupper (__main__.UTest) ... skipped ‘...reason...‘

test_sum (__main__.UTest) ... skipped ‘...reason...‘

test_upper (__main__.UTest) ... skipped ‘...reason...‘

8. 如果要获得测试结果中运行的测试用例的总数以及成功和失败的总数,可以从unittest.TestResult 中获得 失败的个数和运行的总数

suite = unittest.TestLoader().loadTestsFromTestCase(UTest)
runner = unittest.TextTestRunner(verbosity=2)
result = runner.run(suite)
print result.testsRun #运行的测试用例的总数
print len(result.failures) #失败的测试用例的数目

关于 failures: A list containing 2-tuples of TestCase instances and strings holding formatted tracebacks. Each tuple represents a test where a failure was explicitly

signalled using the TestCase.assert*() methods.

时间: 2024-08-08 13:53:26

Python unittest 学习的相关文章

python unittest学习笔记(一)

一:了解unittest unittest:python内部自带的单元测试模块:类同于java的junit: 二:unittest基本使用 1:import unittest 2:定义一个测试类,继承unittest.TestCase 3:setUp和tearDown,每个测试函数运行前.后执行 4:定义测试函数,名字以test开头 5:主要调用assertEqual.assertRaises等断言方法判断程序执行结果和预期值是否相符 6:调用unittest.main()启动测试 (1) 下面

python unittest学习4---跳过测试与预计的失败

当需要跳过某个测试用例或者某个测试类或者预期失败的测试用例,可以使用如下方法,这样就不会导致测试报告结果的失败 import unittestimport sys class TestStringMethods(unittest.TestCase):    @unittest.skipUnless(sys.platform.startswith("os"), "requires Windows")    def test_upper(self):        se

selenium + python的学习清单

环境搭建 python 关注博主:猎摘互联网软件测试业界技术文章专用博客https://blog.csdn.net/cyjs1988 灰蓝    https://blog.csdn.net/huilan_same     selenium    参考:  https://blog.csdn.net/cyjs1988/article/details/78442921               [学习路线]  https://blog.csdn.net/cyjs1988/article/detai

在python下学习libsvm

1.下载libsvm,python,gnuplot(链接网上全有,压缩包自己保留着) 2.在python上的实现(主要用截图的形式展现) (1)输入命令寻求最优参数 (2) 参数c,g输出结果 gnuplot输出图像 (3)最后输入训练数据,训练数据,通过建立模型进行预测 大概也就这样了,grid.py里面需要改下gnuplot的路径 在python下学习libsvm,布布扣,bubuko.com

python unittest不执行"if __name__ == '__main__' "问题

问题: selenium导入unittest框架和HtmlReport框架后,HtmlReport不被执行. 假设代码为: from selenium import webdriver import unittest class Test(unittest.TestCase): print "this is class Test" def setup(self): print "this is setup" def test_1(self): print "

python的学习内容

Python的学习路线 掌握基本的语法 这个入门的东西很多,最好的当然是去看官方的文档,如果英语不好那就另当别论,其次看一些优秀的书籍,当然这个也是耗费时间的,但是如果你要是速成,速度的速,那通过一些博客.视频其实也不失为好的方式,起码上手更容易一些了,尤其是你真正的第一门语言. 掌握常用的库 使用成熟可靠的第三方库是多么的高效,尤其是你就几个人小打小闹的时候,重复造轮子是多么的没有必要,但是你必须理解人家的机制,等你用第三方库多了,有能力写自己的库的时候,那我就是真正的恭喜你了. 自动化运维相

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

python模块学习(2)——re模块

正则表达式并不是python的一部分,正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同:但不用担心,不被支持的语法通常是不常用的部分.如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了. 下图展示了使用正则表达式进行匹配的流程:  正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符

[Python]webservice 学习(4) -- Django+soap

前面学习使用soaplib搭建基于soap的webservice服务,我这个web项目其实只是要提供一两个webservice接口,如果直接写两个脚本外挂感觉挺麻烦,于是想能不能和web框集成到一起.于是在google上搜索,最后在github上找到了这么一段代码,原文地址为https://gist.github.com/rotaris/935809,于是我写简单写了一个demo放到了github上.代码上没有什么变化,只是直接创建了一个小项目,也许能容易看. 项目地址为: https://gi