使用unittest扩展功能测试
打开浏览器–Selenium进行功能测试
在本地在启动Django服务器后,可以使用Selenium实现测试以驱动真正的浏览器,进行功能测试。
创建functional_tests.py文件,代码如下:
from selenium import webdriver
import os
chrome_driver = os.path.abspath(r"C:\Users\stone\Desktop\chromedriver.exe")
os.environ["webdriver.chrome.driver"] = chrome_driver
driver = webdriver.Chrome(chrome_driver)
driver.get("http://localhost:8000")
assert('Django' in driver.title)
这段代码实现如下功能:
- 启动一个Selenium webdriver,打开Chrome浏览器
- 在这个浏览器中打开期望的网页[http://localhost:8000]
- 检查(测试断言)这个网页的标题中是否包含’Django’
使用Selenium实现的测试可以驱动真正的网页浏览器,让我们能从用户的角度查看应用是如何运作的。因此将此类测试叫做“功能测试”。
功能测试 = 验收测试 = 端到端测试 = 黑箱测试
先测试后编码
以TDD模式开发一款软件,它的核心是以测试驱动开发,即先有测试再去开发。编写新的功能测试时,可以先写注释,勾勒出用户故事的重点(需求的实例过程)。这样写出的测试可读性强。以后将以一个待办事务清单的web应用为例,进行TDD敏捷开发。
Python标准库中的unittest
unittest要达到如下目标:
- 支持自动化测试
- 让所有的测试脚本共享 开启(setup) 和 关闭(shutdown) 的代码
- 可以通过集合(collections)的方式来组织测试用例脚本
- 将所有的测试脚本从测试报告框架中独立出来
为了达到以上目标,unittest支持如下几个重要概念:
测试装置(test fixture)
为一个或者多个测试用例做一些准备工作,例如:连接一个数据库,创建一个目录,或者开启一个进程测试用例(test case)
测试用例是测试行为的最小单元,通过对一些输入输出值的对比来进行测试检查测试套件(test suite)
将测试用例或者测试用例集合聚合组织起来的集合。可以批量执行一个测试套件内所有的测试用例测试执行器(test runner)
组织安排测试脚本执行活动的组件。测试执行器通过一些图形界面,文本界面或者返回一些特殊的值来展示测试脚本的测试结果。主要用于生成测试报告
对上述代码使用unittest进行封装:
#coding=utf-8
from selenium import webdriver
import unittest
import os
chrome_driver_path = r"C:\Users\stone\Desktop\chromedriver.exe"
class NewVisitorTest(unittest.TestCase):
def setUp(self):
chrome_driver = os.path.abspath(chrome_driver_path)
os.environ["webdriver.chrome.driver"] = chrome_driver
self.driver = webdriver.Chrome(chrome_driver)
self.driver.implicitly_wait(3) #3秒等待
def tearDown(self):
self.driver.quit()
def test_process(self):
#用户打开在线待办事务应用首页
self.driver.get("http://localhost:8000")
#以确定打开首页,其标题包含‘To-Do’
self.assertIn('To-Do' , self.driver.title)
self.fail('Finish the test.')
#用户的其他操作...
if __name__ == '__main__':
unittest.main()
执行python functional_tests.py [run functional_tests.py],结果如下:
C:\Python27\python.exe D:/Code/Django_tests/test/functional_tests.py
F
======================================================================
FAIL: test_process (__main__.NewVisitorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:/Code/Django_tests/test/functional_tests.py", line 21, in test_process
self.assertIn('To-Do' , self.driver.title)
AssertionError: 'To-Do' not found in u'Welcome to Django'
----------------------------------------------------------------------
Ran 1 test in 6.998s
FAILED (failures=1)
Process finished with exit code 1
由于此处仅有测试,还未进行web-app开发,浏览器打开的首页依然是Django欢迎界面。因此会有AssertionError抛出。
使用PyCharm执行unittest测试类[NewVisitorTest]:Run–>Run[Alt+Shift+F10]–>Unittest in NewVisitorTest,结果如下图:
点击Export Text Results,即可导出测试结果的html文件,便于存档。