unittest,顾名思义就是一个单元测试框架,但是它不仅适用于单元测试,还适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果。

  实例:

  百度搜索界面测试用例Test Case:

 # coding=utf-8

 import unittest
from selenium import webdriver
import time class TestBaiduUi(unittest.TestCase):
def setUp(self):
chromedriver = "C:\Program Files\Google\Chrome\Application\chromedriver"
self.driver = webdriver.Chrome(chromedriver)
self.driver.implicitly_wait(30) # 隐性等待时间为30秒
self.base_url = "https://www.baidu.com" def test_baidu(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.maximize_window()
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys("unittest")
driver.find_element_by_id("su").click()
time.sleep(3)
# 对浏览器标题进行断言测试
title = driver.title
self.assertEqual(title, u"unittest_百度搜索") def tearDown(self):
self.driver.quit() if __name__ == "__main__":
unittest.main()

  豆瓣界面测试用例Test Case:

 # coding=utf-8

 import unittest
from selenium import webdriver
import time class TestDoubanUi(unittest.TestCase): def setUp(self):
chromedriver = "C:\Program Files\Google\Chrome\Application\chromedriver"
self.driver = webdriver.Chrome(chromedriver)
self.driver.implicitly_wait(30) # 隐性等待时间为30秒
self.base_url = "https://www.douban.com/" def test_douban(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.maximize_window()
driver.find_element_by_xpath('//*[@id="anony-nav"]/div[2]/form/span[1]/input').clear()
driver.find_element_by_xpath('//*[@id="anony-nav"]/div[2]/form/span[1]/input').send_keys("复仇者联盟三")
driver.find_element_by_xpath('//*[@id="anony-nav"]/div[2]/form/span[2]/input').click()
time.sleep(3)
# 对浏览器标题进行断言测试
title = driver.title
self.assertEqual(title, u"搜索: 复仇者联盟三") def tearDown(self):
self.driver.quit() if __name__ == "__main__":
unittest.main()

  通过测试套件TestSuite来组装多个测试用例。 

 # coding=utf-8

 import unittest
from com.action import test_baidu
from com.action import test_douban
import HTMLTestRunner
import time # 构造测试集
suite = unittest.TestSuite()
suite.addTest(test_baidu.TestBaiduUi('test_baidu'))
suite.addTest(test_douban.TestDoubanUi('test_douban')) if __name__ == '__main__':
# 执行测试
now = time.strftime("%Y-%m-%M-%H_%M_%S", time.localtime(time.time()))
fp = open("result" + now + ".html", 'wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='UI界面测试', description=u'用例执行情况:')
runner.run(suite)
fp.close() 

  从上述运行实例可以看出:

  一、TestSuite是多个测试用例集合在一起

  二、runner定义测试报告格式,stream定义报告写入的二进制文件,title为报告的标题,description为报告的说明,runner.run()用来运行测试case,注意最后用fp.close()将文件关闭!

  三、用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。

理解unittest(六)的更多相关文章

  1. Java反射的理解(六)-- 通过反射了解集合泛型的本质

    Java反射的理解(六)-- 通过反射了解集合泛型的本质 上述写了那么多,我们可能会有个疑问,为什么要用反射,步骤比我们常规的加载类操作复杂多了,别急,这个问题我最后才解答,我们先来了解集合泛型的本质 ...

  2. Python单元测试——深入理解unittest (转)

    单元测试的重要性就不多说了,可恶的是Python中 有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, no ...

  3. python单元测试--深入理解unittest

    单元测试的重要性就不多说了,可恶的是python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nos ...

  4. Python单元测试——深入理解unittest

    单元测试的重要性就不多说了,可恶的是python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nos ...

  5. 学习C++ Primer 的个人理解(六)

    第四章和第五章没什么特别的.基本上就是书本上的字面意思,也没什么需要注意的细节.直接记录第六章. 本章介绍了函数,其实也没什么特别的.但有几个重点 1.形参的类型决定了形参和实参的交互方式.形参是引用 ...

  6. 深入理解JVM(六)类文件结构

    6.1 关于类文件 1.class文件的一次编译,到处运行的跨平台性: 2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就 ...

  7. 单元测试框架之unittest(六)

    一.摘要 本片博文将介绍unittest框架的一些轻便有效的特性,在我们的测试中经常可以用到 如果有一些测试方法不想执行,如果有些测试方法在某些条件下不执行 该当如何? 如果有些方法未在unittes ...

  8. jvm入门及理解(六)——垃圾回收与算法

    一.jvm垃圾回收要做的事情 哪些内存需要回收 什么时候回收 怎么回收 二.如何判断对象已经死亡,或者说确定为垃圾 引用计数法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1: ...

  9. TensorFlow从入门到理解(六):可视化梯度下降

    运行代码: import tensorflow as tf import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.m ...

随机推荐

  1. 【Alpha】Daily Scrum Meeting——blog3

    团队成员 吴吉键 201421122007(组长) 魏修祺 201421122008 孙劲林 201421122022 1. 会议当天照片 2. 每个人的工作 姓名 已完成工作 计划完成工作 遇到的困 ...

  2. c++中堆、栈内存分配

    转自:https://blog.csdn.net/qingtingchen1987/article/details/7698415 一个由C/C++编译程序占用内存分为以下几个部分1.栈区(stack ...

  3. poj 2289 Jamie's Contact Groups【二分+最大流】【二分图多重匹配问题】

    题目链接:http://poj.org/problem?id=2289 Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 65536K ...

  4. AOP:选择正确的时机进行编织

    在本文中,我们将采用三种重要的实现的例子,来实践本文提出的概念.这三种 AOP 实现是 AspectJ,Spring 和 JBoss.通过比较他们在 Weave 时机方面的不同,来获得对于如何选择 W ...

  5. mybatis #{}和${}的区别是什么

    #{}和${}的区别是什么?正确的答案是:#{}是预编译处理,${}是字符串替换.(1)mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法 ...

  6. Apache去掉index.php

    把 #LoadModule rewrite_module modules/mod_rewrite.so 前面的#去掉, 再把权限AllowOverride None都改为AllowOverride A ...

  7. virtualbox+vagrant学习-2(command cli)-21-vagrant up命令

    Up 格式: vagrant up [options] [name|id] 这个命令根据你的Vagrantfile文件创建和配置客户机. 这是“vagrant”中最重要的一个命令,因为它是创建任何va ...

  8. IE8 下处理select标签高度不居中

    IE8:          Chrome:   同样的代码可是在IE8下select的文字并不是垂直居中. 处理:给select的样式添加padding上下的内边距. 加line-height一点用都 ...

  9. 微信公众号开发 [03] 结合UEditor实现图文消息群发功能

    0.写在前面的话 如何实现微信平台后台管理中的,图文消息发送功能? 大概的过程如下: 通过类似表单的形式,将文章各部分内容提交到后台,封装成一个实体类,并持久化到数据库中 需要推送的时候,将不同的文章 ...

  10. sublime 一些常用功能和快捷键

    Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...