介绍
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的静态类图(下面的类图以及解释均来源于网络,原文链接):
- 一个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()