Python单元测试框架—Unittest

系统 1347 0

介绍

unittest原名为PyUnit,是由Java的JUnit衍生而来.它支持自动化测试,在测试中使用setup(初始化)和shutdown(关闭销毁)操作,组织测试用例为套件(批量运行),以及把测试和报告独立开来。为了实现这些,unittest以一种面向对象的方式产生了一些很重要的概念:

  • test fixture:fixture表示tests运行前需要做的准备工作以及结束后的清理工作。比如,创建临时/代理数据库、目录或启动一个服务器进程。
  • test case:test case是单元测试中的最小个体。它检查特定输入的响应信息。unittest提供了一个基础类:TestCase,用来创建test case。
  • test suite:test suite是test case的合集,通常用test suite将test case汇总然后一起执行。
  • test runner:test runner是一个执行器,它可以执行case并提供结果给用户。它可以提供图形界面、文本界面或者返回一个值表示测试结果。

工作原理

unittest中最核心的五个概念是:test case, test suite, testLoader,test runner, test fixture。

下面我们分别来解释这四个概念的意思,先来看一张unittest的静态类图(下面的类图以及解释均来源于网络,原文链接):

Python单元测试框架—Unittest_第1张图片

  • 一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。单元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
  • 而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
  • TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
  • TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。 
  • 测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
  • 而对一个测试用例环境的搭建和销毁,是一个fixture。

简单示例

            
              # coding=utf-8

__author__ = "小小渔夫"

from appium import webdriver
from common.HTMLTestRunner import HTMLTestRunner
import unittest


class LoginTest(unittest.TestCase):
    def setUp(self):
        desired_caps = {
            'platformName': 'Android',
            'deviceName': 'SGEEGEHIQ8I7CI90',
            'platformVersion': '7.0',
            'appPackage': 'com.XXX.mall',
            'appActivity': '.business.main.MainActivity'
        }
        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

    def testCase(self):
        self.driver.find_element_by_id("bottom_nav").click()
        self.driver.find_element_by_name('使用其他方式登录').click()
        self.driver.find_element_by_name('手机登录').click()
        self.driver.find_element_by_id("username").send_keys("18300000000")
        self.driver.find_element_by_name('获取验证码').send_keys("123456")
        self.driver.find_element_by_id("btn").click()

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    filename = "E:\\report.html"
    # stream测试报告写入文件的存储区域,verbosity参数可以控制输出的错误报告的详细程度,默认为1如果设为0,则不输出每一用例的执行结果,如果设为 2,则输出详细的执行结果
    runner = HTMLTestRunner.HTMLTestRunner(title="测试报告标题", description="这是测试报告的描述", stream=open(filename, "wb"),verbosity=2, retry=0)
    runner.run()


            
          

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论