zoukankan      html  css  js  c++  java
  • unittest(装饰器)

    1、前言

    前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间。

    于是就想是不是可以只打开一次浏览器,执行完用例再关闭呢?这就需要用到装饰器(@classmethod)来解决了。

    2、@classmethod 装饰器中的 setUpClass() 和 tearDownClass() 与 setUp() 和 tearDown() 的区别

    • setUp():每个测试 case 运行之前运行
    • tearDown():每个测试 case 运行完之后执行
    • setUpClass():必须使用 @classmethod 装饰器,  所有 case 运行之前只运行一次
      • @是修饰符,classmethod 是 python 里的类方法
    • tearDownClass():必须使用 @classmethod 装饰器, 所有 case 运行完之后只运行一次
    import unittest
    
    class Test(unittest.TestCase):
    
        @classmethod
        def setUpClass(cls) -> None:
            print("-----开始执行用例-----")
    
        def setUp(self) -> None:
            print("执行用例准备动作...")
        def test01(self):
            print("第一条用例正在执行...")
        def test02(self):
            print("第二条用例正在执行...")
        def tearDown(self) -> None:
            print("用例执行完结动作...")
            
        @classmethod
        def tearDownClass(cls) -> None:
            print("-----用例执行结束-----")
            
    if __name__ == '__main__':
        unittest.main()
    
    #执行结果如下:
    """
    -----开始执行用例-----
    执行用例准备动作...
    第一条用例正在执行...
    用例执行完结动作...
    执行用例准备动作...
    第二条用例正在执行...
    用例执行完结动作...
    -----用例执行结束-----
    """
    from selenium import webdriver
    import unittest
    from time import sleep
    
    class DymLogin(unittest.TestCase):
    
        @classmethod
        def setUpClass(cls) -> None:
            """
            所有的用例只需要执行一次打开浏览器操作
            """
            print("Test start...")
            cls.dr = webdriver.Chrome()
            cls.dr.get("http://www.duoyoumi.com/")
            cls.dr.implicitly_wait(10)
            cls.dr.maximize_window()
            cls.dr.find_element_by_class_name("login").click()
            sleep(1)
    
        @classmethod
        def tearDownClass(cls) -> None:
            sleep(2)
            cls.dr.quit()
            print("Test end...")
    
        def test_login01(self):
            """
            账号密码都为空
            """
            self.dr.find_element_by_name("loginName").clear()
            self.dr.find_element_by_name("loginPwd").clear()
            self.dr.find_element_by_xpath('//*[@id="loginForm"]/div/div/div/div[2]/div[1]/div[2]').click()     #登录操作
            TipsMsg = self.dr.find_element_by_class_name("promptLogin").text
            self.assertEqual(TipsMsg,"-请输入登录账号!",msg="Test_login01 login exception")
    
        def test_login02(self):
            """
            账号正确,密码为空
            """
            self.dr.find_element_by_name("loginName").clear()
            self.dr.find_element_by_name("loginPwd").clear()
            self.dr.find_element_by_name("loginName").send_keys("17779828887")
            self.dr.find_element_by_xpath('//*[@id="loginForm"]/div/div/div/div[2]/div[1]/div[2]').click()  # 登录操作
            TipsMsg = self.dr.find_element_by_class_name("promptLogin").text
            self.assertEqual(TipsMsg, "-请输入密码!", msg="Test_login02 login exception")
    
        def test_login03(self):
            """
            账号密码都正确
            """
            self.dr.find_element_by_name("loginName").clear()
            self.dr.find_element_by_name("loginPwd").clear()
            self.dr.find_element_by_name("loginName").send_keys("17779828887")
            self.dr.find_element_by_name("loginPwd").send_keys("zy295240???")
            self.dr.find_element_by_xpath('//*[@id="loginForm"]/div/div/div/div[2]/div[1]/div[2]').click()     #登录操作
            sleep(2)
            TipsMsg = self.dr.find_element_by_css_selector("#w_nav_temp_1000 > div.fr.dl > a:nth-child(4)").text
            self.assertEqual(TipsMsg,"[退出]",msg="Test_login03 login exception")
    
    if __name__ == '__main__':
        unittest.main()
    
    
    
    #执行结果如下
    """
    Test start...
    ...
    Test end...
    ----------------------------------------------------------------------
    Ran 3 tests in 25.253s
    
    OK
    """

     3、通过装饰器跳过某条用例

    • 添加装饰器(@unittest.skip(""))
    import unittest
    
    class Test(unittest.TestCase):
    
        def setUp(self) -> None:
            print("---start---")
    
        def tearDown(self) -> None:
            print("---end---")
    
        def testbbb(self):
            print("case testbbb")
    
        @unittest.skip("testaaa 被跳过")
        def testaaa(self):
            print("case testaaa")
    
    if __name__ == '__main__':
        unittest.main()
    
    # 结果如下
    s.
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    OK (skipped=1)
    
    ---start---
    case testbbb
    ---end---

      

  • 相关阅读:
    20171229
    对象关系型数据库管理系统(PostgresQL )
    CDN技术之--集群服务与负载均衡
    CDN技术之-介绍
    oracle不同用户间访问表不添加用户名(模式)前缀
    ora-28000 the account is locked
    CDN技术之--该技术概述
    CDN技术之--内容缓存工作原理
    PL/SQL题型代码示例
    在java中使用solr7.2.0 新旧版本创建SolrClient对比
  • 原文地址:https://www.cnblogs.com/ZhengYing0813/p/12343875.html
Copyright © 2011-2022 走看看