python+unittets框架

匿名 (未验证) 提交于 2019-12-02 22:51:30

本文来源于:https://www.cnblogs.com/insane-Mr-Li/p/9132406.html

我们整个自动化才是报告的环节基本上分为三个部分:

1.测试用例的准备

2.测试用例的执行

3.测试报告的输出

1.测试用例的准备:

那我们就以搜孤网页做一个简单的用例:

from selenium import webdriver import unittest class Case_1(unittest.TestCase):     def setUp(self):         self.driver = webdriver.Chrome()         self.driver.maximize_window()#放大浏览器         self.driver.get("https://www.sogou.com/")     def test_001(self):         self.driver.find_element_by_link_text('微信').click()         self.assertIn(self.driver.title,u'搜狗微信搜索_订阅号及文章内容独家收录,一搜即达')     def test_002(self):         self.driver.find_element_by_link_text('新闻').click()         self.assertIn(self.driver.title,u'搜狗新闻 - 上网从搜狗开始')     def test_003(self):         self.driver.find_element_by_link_text('图片').click()         self.assertIn(self.driver.title,u'搜狗图片-上网从搜狗开始')     def tearDown(self):         self.driver.close()         self.driver.quit() if __name__ == '__main__':     unittest.main()     print('简单的用例')

2-3.用例执行与测试报告的输出:

import os,time,unittest import HTMLTestRunner  report_path = os.getcwd()#'F:\Python\Interface_automation' now = time.strftime('%y-%m-%d %H:%M',time.localtime(time.time()))#获取当前信息并且以前面的格式输出 title = u'搜狗首页链接测试报告'#标题 report_repash = os.path.join(report_path,title + now + '.html')#这里只要是组成一个测试报告路径 print(report_repash)  #导入用例 def case_all():     case_pash = 'F:\Python\Interface_automation'     discover = unittest.defaultTestLoader.discover(case_pash,pattern='ceshi*.py')#添加用例,在case_path的路径下,所有以ceshi开头的文件都当做用例文件执行     return discover  if __name__ == '__main__':     fp = open(report_repash, "wb") # 保存报告文件     print(fp)     runner = HTMLTestRunner.HTMLTestRunner(stream=fp,                                            title=title + ':',)     runner.run(case_all()) # 执行用例     fp.close() '''二、unittest.defaultTestLoader.discover加载测试用例  1.discover方法里面有三个参数:  -case_dir:这个是待执行用例的目录。  -pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。  -top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。  2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,这样就可以用unittest里面的TextTestRunner这里类的run方法去执行。'''

这就是一个完整的测试用例的产生-执行-结果输出的一个过程其中测试用例的执行有三种办法:

如下:

# coding=utf-8 #1.先设置编码,utf-8可支持中英文,如上,一般放在第一行  #2.注释:包括记录创建时间,创建人,项目名称。 ''' Created on 2016-7-27 @author: Jennifer Project:使用unittest框架编写测试用例思路 ''' #3.导入unittest模块 import unittest  #4.定义测试类,父类为unittest.TestCase。 #可继承unittest.TestCase的方法,如setUp和tearDown方法,不过此方法可以在子类重写,覆盖父类方法。 #可继承unittest.TestCase的各种断言方法。 class Test(unittest.TestCase):  #5.定义setUp()方法用于测试用例执行前的初始化工作。 #注意,所有类中方法的入参为self,定义方法的变量也要“self.变量” #注意,输入的值为字符型的需要转为int型     def setUp(self):         self.number=raw_input('Enter a number:')         self.number=int(self.number)  #6.定义测试用例,以“test_”开头命名的方法 #注意,方法的入参为self #可使用unittest.TestCase类下面的各种断言方法用于对测试结果的判断 #可定义多个测试用例 #最重要的就是该部分     def test_case1(self):         print(self.number)         self.assertEqual(self.number,10,msg='Your input is not 10')      def test_case2(self):         print(self.number)         self.assertEqual(self.number,20,msg='Your input is not 20')      @unittest.skip('暂时跳过用例3的测试')     def test_case3(self):         print (self.number)         self.assertEqual(self.number,30,msg='Your input is not 30')  #7.定义tearDown()方法用于测试用例执行之后的善后工作。 #注意,方法的入参为self     def tearDown(self):         print ('Test over')  #8如果直接运行该文件(__name__值为__main__),则执行以下语句,常用于测试脚本是否能够正常运行 if __name__=='__main__': #8.1执行测试用例方案一如下: #unittest.main()方法会搜索该模块下所有以test开头的测试用例方法,并自动执行它们。 #执行顺序是命名顺序:先执行test_case1,再执行test_case2     unittest.main()  ''' #8.2执行测试用例方案二如下: #8.2.1先构造测试集 #8.2.1.1实例化测试套件     suite=unittest.TestSuite() #8.2.1.2将测试用例加载到测试套件中。 #执行顺序是安装加载顺序:先执行test_case2,再执行test_case1     suite.addTest(Test('test_case2'))     suite.addTest(Test('test_case1')) #8.2.2执行测试用例 #8.2.2.1实例化TextTestRunner类     runner=unittest.TextTestRunner() #8.2.2.2使用run()方法运行测试套件(即运行测试套件中的所有用例)     runner.run(suite) '''  ''' #8.3执行测试用例方案三如下: #8.3.1构造测试集(简化了方案二中先要创建测试套件然后再依次加载测试用例) #执行顺序同方案一:执行顺序是命名顺序:先执行test_case1,再执行test_case2     test_dir = './'     discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py') #8.3.2执行测试用例 #8.3.2.1实例化TextTestRunner类     runner=unittest.TextTestRunner() #8.3.2.2使用run()方法运行测试套件(即运行测试套件中的所有用例)     runner.run(discover) '''

unittest基本原理:

其他的unitest的属性:

unittest.skip():装饰器,当运行用例时,有些用例可能不想执行等,可用装饰器暂时屏蔽该条测试用例。一种常见的用法就是比如说想调试某一个测试用例,想先屏蔽其他用例就可以用装饰器屏蔽。

      @

      @

      @

      @unittest.expectedFailure(): expectedFailure()测试标记为失败。

2.TestCase类的属性如下:

:setUp()方法用于测试用例执行前的初始化工作。如测试用例中需要访问数据库,可以在setUp中建立数据库连接并进行初始化。如测试用例需要登录web,可以先实例化浏览器。

:tearDown()方法用于测试用例执行之后的善后工作。如关闭数据库连接。关闭浏览器。

一些断言方法:在执行测试用例的过程中,最终用例是否执行通过,是通过判断测试得到的实际结果和预期结果是否相等决定的。

    assertEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,相等则测试用例通过。

    assertNotEqual(a,b,[msg='测试失败时打印的信息']):断言a和b是否相等,不相等则测试用例通过。

    assertTrue(x,[msg='测试失败时打印的信息']):断言x是否True,是True则测试用例通过。

    assertFalse(x,[msg='测试失败时打印的信息']):断言x是否False,是False则测试用例通过。

    assertIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,是则测试用例通过。

    assertNotIs(a,b,[msg='测试失败时打印的信息']):断言a是否是b,不是则测试用例通过。

    assertIsNone(x,[msg='测试失败时打印的信息']):断言x是否None,是None则测试用例通过。

    assertIsNotNone(x,[msg='测试失败时打印的信息']):断言x是否None,不是None则测试用例通过。

    assertIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,在b中则测试用例通过。

    assertNotIn(a,b,[msg='测试失败时打印的信息']):断言a是否在b中,不在b中则测试用例通过。

    assertIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,是则测试用例通过。

    assertNotIsInstance(a,b,[msg='测试失败时打印的信息']):断言a是是b的一个实例,不是则测试用例通过。

通过dir(unittest),我们可以看到unittest全部的属性和方法,他们的关系如下图所示。

unittest主要类关系:

可以通过手动调用TestSuite的addTest、addTests方法来动态添加TestCase,这样既可以确定添加用例的执行顺序,也可避免TestCase中的验证方法一定要用test开头。

一套整体的流程如下:

3.TestSuite类的属性如下:(组织用例时需要用到):

suite = unittest.TestSuite() suite.addTest(test_baidu.BaiduTest('test_baidu'))

4.TextTextRunner的属性如下:(组织用例时需要用到):

 

runner = unittest.TextTestRunner() runner.run(suite)

5.unitest的目录结构一般如下:重要

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!