appium python unittest_贝程学院:Appium与Python类库之Unittest

一.unittest介绍

unittest是 Kent Beck 和 Erich Gamma 所设计的 JUnit 的 Python 版本。从 Python 2.1 版本后,PyUnit 成为 Python 标准库的一部分。它是JUnit的Python语言实现,JUnit是单元测试(Unit test)框架,单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。举例来说,对于桌子来说,桌面,螺丝,等,都是单元,验证这些单元行为或功能是否符合预期,才可确保桌子能用。

unittest 模块包括四个部份:Test fixture一个test fixture代表执行一个或者多个测试时需要准备环境,以及相关联的清理环境的工作。这包含很多内容,例如,创建临时或代理数据库,目录,或启动一个服务器进程。Test case一个test case就是测试用例,测试当中的最小单元。unittest提供一个基本的类TestCase,用来创建一个test case。Test suiteTest suite是一组test case或者test suite的集合,也可以两者都有。用来将需要一同执行的测试用例聚合到一起。Test runner一个test runner是用来执行测试用例的,对测试进行编排并把结果返回给用户。

下图是unittest的静态类图:

二.开发单元测试代码流程

编写一个单元测试的步骤:

Step 1 :定义函数来进行测试

首先构造Count类,有加减乘除四个方法,文件名叫count.py

class Count():

def add(a,b):

return a + b

def minus(a,b):

return a - b

def multi(a, b):

return a * b

def divide(a, b):

return a / b

Step 2 :创建testCount.py导入unittest模块在你的程序。

创建继承unittest.TestCase的测试用例。

定义测试的类中的方法。

为测试用例添加断言。

通过断言进行结果比较。

from count import Count

import unittest

class TestCount(unittest.TestCase):

def setUp(self):

pass

def test_add(self):

self.assertEqual(7,Count.add(3,4))

def test_minus(self):

self.assertEqual(6,Count.minus(10,4))

def tearDown(self):

pass

if __name__ == "__main__":

unittest.main()

技术解释:上例子使用了 assertEqual() 方法。unittest 中有很多类似assert 方法,如 NotEqual、Is(Not)None、True(False)、Is(Not)Instance 等针对变量值的校验方法;另外还有一些如 assertRaises()、assertRaisesRegex() 等针对异常、警告和 log 的检查方法。

Step 3:调用main()

if __name__ == "__main__":

unittest.main()

Step 4 :运行脚本

技术解释:其中setUp(), tearDown() 和 aseertEqual() 都是TestCase类下的方法。setUp 用于设置初始化的部分,在测试用例执行前,这个方法中的函数将先被调用。如初始化浏览器的调用。tearDown 方法在每个测试方法执行后调用,这个地方做所有清理工作,如退出浏览器等。测试的方法通常以test开头,unitest.main()函数用来测试类中以test开头的测试用例。

三.组织TestSuite

上面的代码示例了编写简单的测试,控制用例执行的顺序如先执行方法A,再执行方法B,就要用到TestSuite了。向TestSuite添加case,它们是按照添加的顺序执行的。

A.直接在suite()中添加测试用例

import unittest

from testcount import TestCount

if __name__ == '__main__':

suite = unittest.TestSuite()

tests = [TestCount("test_add"), TestCount("test_minus"),TestCount("test_divide"),TestCount("test_multi")]

suite.addTests(tests)

unittest.main(defaultTest='suite')

运行结果:test_add (testcount.TestCount) ... ok

test_minus (testcount.TestCount) ... ok

test_divide (testcount.TestCount) ... ok

test_multi (testcount.TestCount) ... ok

----------------------------------------------------------------------

Ran 4 tests in 0.001s

B.若测试用例都是以 test开头,则用 makeSuite()方法一次性运行

import unittest

from testcount import TestCount

if __name__ == '__main__':

suite = unittest.makeSuite(TestCount, "test")

unittest.main(defaultTest='suite')

C.l 使用TestRunner的子类 TextTestRunner来执行

import unittest

from testcount import TestCount

if __name__ == '__main__':

suite = unittest.TestSuite()

suite.addTest(TestCount("test_add"))

suite.addTest(TestCount("test_minus"))

runner = unittest.TextTestRunner()

runner.run(suite)

D.严格按照test开头,则直接用 unittest.main()即可

if __name__ =="__main__":

unittest.main()

技术解释:suite()为全局方法,是unittest的TestSuite(),通过 addTest(类名("方法名"))来添加测试用例,例如一个类中可以写多个用例,通过suite()使之形成多个测试用例被执行。

四.输出测试报告HTMLTestRunner是Python的一个测试报告 :

2.环境准备 :下载HTMLTestRunner.py 文件,放在python的包文件夹下,例如 C:\Python35\Lib

3.修改源码:

因为HTMLTestRunner是基于Python2开发的,如果在Python3环境下使用,需要对其部分内容进行修改。使用notepad++打开HTMLTestRunner.py文件,修改如下内容:第94行,将import StringIO修改成import io

第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer= io.StringIO()

第631行,将print >> sys.stderr, ‘\nTime Elapsed: %s‘ %(self.stopTime-self.startTime)修改成print(sys.stderr, ‘\nTimeElapsed: %s‘ % (self.stopTime-self.startTime))

第642行,将if not rmap.has_key(cls):修改成if not cls in rmap:

第766行,将uo = o.decode(‘latin-1‘)修改成uo = e

第772行,将ue = e.decode(‘latin-1‘)修改成ue = e

4.编写代码:

# -*- coding: utf-8 -*-

import unittest

from testcount import TestCount

from HTMLTestRunner import HTMLTestRunner

if __name__ == '__main__':

suite = unittest.TestSuite()

suite.addTest(TestCount("test_add"))

suite.addTest(TestCount("test_minus"))

fp = open('HTMLReport.html', 'wb')

runner = HTMLTestRunner(

stream=fp,

title=u'count测试报告',

description=u'用例执行情况:')

runner.run(suite)

fp.close()

技术解释:import HTMLTestRunner导入模块,estSuite()可以看作成一个容器 ,可通过 addTests 方法把要执行的用例添加到该容器里,fp=open(‘HTMLReport.html’,’wb’):创测试报告的html文件,此时还是个空文件,runner = HTMLTestRunner( stream=fp, title=u'count测试报告', description=u'用例执行情况:')定义 HTMLTestRunner 测试报告,stream 定义报告所写入的文件;title 为报告的标题;description 为报告的说明与描述.runner.run(suite),运行测试容器中的用例,并将结果写入的报告中。fp.close()关闭文件流,将HTML内容写进测试报告文件。

5.输出报告

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值