一、discover方法

discover方法可以根据标准加载用例,并将结果返回给测试套件(suite),start_dir:待测试的目录,pattern:测试用例文件名的匹配规。

如:

start_dir = './test_case'suites = unittest.defaultTestLoader.discover(start_dir ,pattern='test.*py')

当执行多个目录的测试用例时,如何查找test_case下的其他目录吃里的测试用例文件呢?就是在test_case下每个目录里加__init__.py文件,这样会把这个目录当做标记成一个标准的Python模块。

二、测试用例的执行顺序是根据ASCLL码的顺序执行的。如:test_aaa.py优先于test_bbb.py。

三、装饰器 。这些装饰器不仅用在方法上,同样适用于类。四#跳过测试和预期失败

  1. class MyTest(unittest.TestCase):
    @unittest.skip('直接跳过测试')
    def test_skip(self):
    print('test aaa')
  2.  
  3. @unittest.skipIf(3>2,'条件为真时跳过装饰的测试')
    def test_skip_if(self):
    print('test bbb')
  4.  
  5. @unittest.skipUnless(3>2,'条件为真时执行装饰的测试')
    def test_skip_unless(self):
    print('test ccc')
  6.  
  7. @unittest.expectedFailure
    def test_expected_failure(self):
    self.assertEqual(3,3)
  8.  
  9. if __name__ == '__main__':
    unittest.main()
  10.  
  11. 四、Fixture 执行一个或者多个测试所需要的环境。如创建临时或者代理 数据库、目录、或者启动服务器进程。
  1. import unittest
  2.  
  3. def setUpModule():
    print('test module start >>>>>>>>>>>>>>>>')
    def tearDownModule():
    print('test module end >>>>>>>>>>>>>>>>>>')
  4.  
  5. class MyTest2(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
    print('test class start >>>>>>>>>>>>>>')
  6.  
  7. @classmethod
    def tearDownClass(cls):
    print('test class end >>>>>>>>>>>>>>>>')
  8.  
  9. def setUp(self):
    print('test case start>>>>>>>>>>>>>>')
  10.  
  11. def tearDown(self):
    print('test case end>>>>>>>>>>>>>>>')
  12.  
  13. def test_case1(self):
    print('test case1')
  14.  
  15. def test_case2(self):
    print("test case2")
  16.  
  17. if __name__ == '__main__':
    unittest.main()
  1.  
  1. 五、断言方法。
  1. class TestAssert(unittest.TestCase):
  2.  
  3. def test_equal(self):
    self.assertEqual(2+2,4)
    self.assertEqual('python','python')
    self.assertNotEqual('python','pythno')
  4.  
  5. def test_in(self):
    self.assertIn('hello','hello world')
    self.assertNotIn('hi','hello')
  6.  
  7. def test_true(self):
    self.assertTrue(1) # or Ture
    self.assertFalse(0) # or False
  1. 六、数据驱动应用。
    常用的csv读取数据执行用例,会导致所有数据被当做一条用例来执行,只要有一条用例失败,那么整个用例就执行失败了。一种解决方法是将数据读取到列表中,在用例中按照下标来调用。
    但是这样有两个问题,一是每次都要读取文件,耗费空间,二是数据在列表中,如果插入一条数据,或者删除一条数据,那么用例在调用数据时就会非常容易出错,不利于维护。
  1. 下面介绍2个模块来解决数据驱动问题。
    ParameterizedPython的一个库。支持unittestpytestNose框架。
  1. import unittest
    from time import sleep
    from selenium import webdriver
    from parameterized import parameterized
  2.  
  3. class TestBaidu(unittest.TestCase):
    '''百度搜索测试'''
    @classmethod
    def setUpClass(cls):
    cls.driver = webdriver.Chrome()
    cls.base_url = 'https://www.baidu.com'
  4.  
  5. def baidu_search(self,search_key):
    self.driver.get(self.base_url)
    self.driver.find_element_by_id('kw').send_keys(search_key)
    self.driver.find_element_by_id('su').click()
    sleep(2)
  6.  
  7. @parameterized.expand([
    ('case1','selenium'),
    ('case2', 'unittest'),
    ('case3', 'parameterized'),
    ])
    def test_search(self,name,search_key):
    ''''''
    self.baidu_search(search_key)
    self.assertEqual(self.driver.title,search_key + '_百度搜索')
  8.  
  9. @classmethod
    def tearDownClass(cls):
    cls.driver.quit()
  10.  
  11. if __name__ == '__main__':
    unittest.main()
  12.  
  13. @parameterized.expand()中每个元组都是一条测试用例。name对应的是元组中第一列数据,search_key对应的是第二列数据参数化会自动加上0,1,2来区分每条用例。元组中的数据作为用例名的后缀出现在测试报告中

    DDTuittest的一个扩展库。
    测试类需要通过@ddt装饰器进行装饰。DDT提供不同形式的参数化,比如列表,元组,字典等。需要注意字典的KEY与测试方法的参数要保持一致。
    DDT也支持数据文件(json)的参数化。
  1. import unittest
    from time import sleep
    from selenium import webdriver
    from ddt import ddt,data,file_data,unpack
  2.  
  3. @ddt
    class TestBaidu(unittest.TestCase):
    '''百度搜索测试'''
    @classmethod
    def setUpClass(cls):
    cls.driver = webdriver.Chrome()
    cls.base_url = 'https://www.baidu.com'
  4.  
  5. def baidu_search(self,search_key):
    self.driver.get(self.base_url)
    self.driver.find_element_by_id('kw').send_keys(search_key)
    self.driver.find_element_by_id('su').click()
    sleep(2)
  6.  
  7. @data(['case1','selenium'],['case2','unittest'],['case3', 'parameterized'])
    @unpack
    def test_search1(self,name,search_key):
    print('第一组测试用例:', name)
    self.baidu_search(search_key)
    self.assertEqual(self.driver.title,search_key + '_百度搜索')
  8.  
  9. @data(('case1','selenium'),
    ('case2', 'unittest'),
    ('case3', 'parameterized'),)
    @unpack
    def test_search2(self, name, search_key):
    print('第二组测试用例:',name)
    self.baidu_search(search_key)
    self.assertEqual(self.driver.title, search_key + '_百度搜索')
  10.  
  11. @data({"search_key":"python"},{"search_key":"ddt"},{"search_key":"Selenium"})
    @unpack
    def test_search2(self, search_key):
    print('第三组测试用例:',search_key)
    self.baidu_search(search_key)
    self.assertEqual(self.driver.title, search_key + '_百度搜索')
  12.  
  13. # @file_data('ddt_data_file.json')
    # def test_search4(self, search_key):
    # print('第四组测试用例:',search_key)
    # self.baidu_search(search_key)
    # self.assertEqual(self.driver.title, search_key + '_百度搜索')
  14.  
  15. @classmethod
    def tearDownClass(cls):
    cls.driver.quit()
  16.  
  17. if __name__ == '__main__':
    unittest.main()
  1.  
  1. ddt_data_file.json
  1. {
    "case1":{"search_key":"python"},
    "case2":{"search_key":"ddt"},
    "case3":{"search_key":"Selenium"}
  2.  
  3. }
  4.  
  5. 七、HTML测试报告。HTMLTestRunner支持Python3的下载地址:https://github.com/defnngj/HTMLTestRunner
  1. #获取当前的时间
    now_time = time.strftime('%Y-%m-%d %H_%M_%S')
    HTML_report = './test_report/'+now_time+'result.html'
    fp = open(HTML_report,'wb')
    runner = HTMLTestRunner(stream=fp,title='Fixture', description='运行环境:Windows 10,Chrome浏览器')
    runner.run(suites)
    #关闭
    fp.close()
  1.  
  1.  

unittest 的用法的更多相关文章

  1. PyUnit (unittest) 的用法

    PyUnit(unittest) 是 Python 自带的单元测试框架,用于编写和运行可重复的测试.PyUnit 是 xUnit 体系的一个成员,xUnit 是众多测试框架的总称,PyUnit 主要用 ...

  2. 记录python接口自动化测试--unittest框架基本应用(第二目)

    在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo 1.unittest简单用 ...

  3. python unittest框架装饰器

    要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...

  4. unittest单元测试,基于java的junit测试框架

    import unittestclass study(unittest.TestCase): def testXia(self): self.assertEqual((3*4),20) def tes ...

  5. Python unittest(PyUnit)单元测试框架

    PyUnit(unittest) 是 Python 自带的单元测试框架,用于编写和运行可重复的测试.PyUnit 是 xUnit 体系的一个成员,xUnit 是众多测试框架的总称,PyUnit 主要用 ...

  6. <自动化测试>之<unittest框架使用1>

    要说单元测试和UI自动化之间的是什么样的一个关系,说说我个人的一些心得体会吧,我并没有太多的这方面经验,由于工作本身就用的少,还有就是功能测试点点对于我这种比较懒惰的人来说,比单元测试复杂...思考单 ...

  7. unittest学习

    unittest的四大特点 TestCase:测试用例.所有的用例都是直接继承与UnitTest.TestCase类. TestFixture:测试固件.setUp和tearDown分别作为前置条件和 ...

  8. selenium+python笔记3

    #!/usr/bin/env python # -*- coding: utf-8 -*- """ @desc:学习unittest的用法 注意setUp/setUpCl ...

  9. 自研测试框架ktest介绍(适用于UI和API)

    iTesting,爱测试,爱分享 在自动化测试的过程中,测试框架是我们绕不过去的一个工具,无论你是不需要写代码直接改动数据生成脚本,还是你需要检查测试结果甚至持续集成,测试框架都在发挥它的作用. 不同 ...

随机推荐

  1. MongoDB 创建数据库和查询数据

    1.选择数据库  use test  2.创建用户  db.createUser({user:"test01",pwd:"12345",roles:[{role ...

  2. DBCP连接池原理分析(转载)

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...

  3. 删除svn用户

    以win7为例 1.进入c:/Users/[你的用户名]/AppData/Roaming/Subversion/auth目录,删除该目录下的所有文件: 2.重启eclipse/myeclipse,提交 ...

  4. Postgresql Useful SQL/Commands

    Update records ' and a.subscriber_id=b.subscriber_id; Connections select count(*) from pg_stat_activ ...

  5. 是什么是FBC CBV

    - FBV url   -   函数 - CBV url   -   view

  6. Laradock Laravel database connection refused

    Laradock Laravel database connection refused SHARE  Laradock is a PHP development environment which ...

  7. Lavavel Lifecycle

  8. SpringMVC拦截器及多拦截器时的执行顺序

    本文链接:https://blog.csdn.net/itcats_cn/article/details/80371639拦截器的配置步骤 springmvc.xml中配置多个拦截器配置自定义拦截器并 ...

  9. tinymce编辑器从word粘贴公式

    很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...

  10. 元素(element)创建

    一.元素创建的三种方式-------元素创建是为了提高用户的体验 1.第一种 document.write("标签代码及内容") <input type="butt ...