Unittest
一、unittest组成
1、TestCase (最核心的模块)
测试用例,每个TestCase 都是一个代码文件,在这个代码文件中来书写真正的用例代码。
2、TestSuite
测试套件,用来管理、组装(打包)多个TestCase
3、TestRunner
测试执行,用来执行TestSuite
4、TestLoader
测试加载,对TestSuite的补充
5、Fixture
测试夹具,书写在TestCase 代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容
二、测试用例TestCase
- 测试文件必须先导入import unittest
- 测试类必须继承unittest.TestCase
- 测试方法必须以test开头
- main方法中 unittest.main()
创建demo.py
  
1 from time import sleep 2 from selenium import webdriver 3 import unittest 4 5 6 class TestLogin(unittest.TestCase): 7 8 def setUp(self): 9 """ 10 前置操作 11 :return: 12 """ 13 self.driver = webdriver.Chrome() 14 self.driver.get("https://mail.163.com/") 15 self.driver.maximize_window() 16 17 def tearDown(self): 18 """ 19 后置操作 20 :return: 21 """ 22 sleep(3) 23 self.driver.quit() 24 25 def test_login(self): 26 """ 27 测试登录 28 :return: 29 """ 30 31 login_action = LoginAction() 32 login_action.login(self.driver, "xiao_wlkq", "1223434") 33 sleep(3) 34 self.assertIn('xiao_wlkq', self.driver.page_source) 35 36 37 if __name__ == '__main__': 38 unittest.main()
三、测试套件(TestSuite) & 测试执行(TestRunner)
  创建demo1.py,demo2.py
  创建suite_runner.py
  
四、测试加载TestLoader
1、创建tools.py
   
                
2、创建demo.py
   
       
3、使用默认对象的写法
    
   
1 import unittest 2 3 from POM.Setting.Config import testCase_path 4 5 if __name__ == '__main__': 6 suit = unittest.TestLoader().discover(testCase_path) 7 unittest.TextTestRunner().run(suit)
五、测试夹具Fixtrue
- 模块级(setUpModule/tearDownModule)在模块始末调用
- 类级(setUpClass/tearDownClass)在类始末调用(在类中)
- 方法级(setUp/tearDown)在方法始末调用(在类中)
1、方法级
  
2、类级
  
3、模块级
  
六、数据驱动实现
1、导包
import ddt as ddt
2、类前加装饰器@ddt.ddt
  
3、测试方法前加@ddt.data(*testdata) 注意:* 代表拆包的动作
  
1 from time import sleep 2 from selenium import webdriver 3 import unittest 4 import ddt 5 6 testData = [{'username': 'xiao_wlkq', 'password': '953680003xp@'}] 7 8 @ddt.ddt 9 class TestLogin(unittest.TestCase): 10 11 def setUp(self): 12 """ 13 前置操作 14 :return: 15 """ 16 self.driver = webdriver.Chrome() 17 self.driver.get("https://mail.163.com/") 18 self.driver.maximize_window() 19 20 def tearDown(self): 21 """ 22 后置操作 23 :return: 24 """ 25 sleep(3) 26 self.driver.quit() 27 28 @ddt.data(*testData) 29 def test_login(self, tempdata): 30 """ 31 测试登录 32 :return: 33 """ 34 username = tempdata["username"] 35 password = tempdata["password"] 36 login_action = LoginAction() 37 login_action.login(self.driver, username, password) 38 sleep(3) 39 40 if __name__ == '__main__': 41 unittest.defaultTestLoader.discover('./test_login.py', 'test_login.py')
七、断言方法

1、用assertIn断言页面某个内容是否页面上
self.assertIn("Hi", self.driver.page_source)
八、跳过
对于一些未完成的或者不满足测试条件的测试函数和测试类,不想执行,可以跳过写在TestCase文件中:
@unittest.skip('跳过的原因') 直接将测试函数标记成跳过@unittest.skipIf(判断条件,'跳过原因') 根据条件判断测试函数是否跳过
 
九、测试报告
地址:https://i.cnblogs.com/files HTMLTestRunner-master.zip 解压
cd /Users/xiao/Desktop/work/1224/HTMLTestRunner-master
python setup.py install
import time
import unittest
from TestRunner import HTMLTestRunner
from POM.Setting.Config import testCase_path, testReport_Path
if __name__ == '__main__':
now = time.strftime("%Y.%m.%d %H:%M:%S")
suit = unittest.TestSuite()
loader = unittest.TestLoader()
suit.addTest(loader.discover(testCase_path))
report = "./result.html"
with(open(testReport_Path + '/' + now + '_report.html', 'wb')) as fp:
runner = HTMLTestRunner(
stream=fp,
title='163邮箱登录UI自动化测试报告',
description='浏览器chrome,平台macOS'
)
runner.run(suit)
fp.close()
参考:https://zhuanlan.zhihu.com/p/476379656
十、踩坑
用suite这个地方有好几个坑
1、如果用pycharm,运行时不要点左边的按钮,要注意运行整个py文件,否则可能会执行全部用例
  
2、当用ddt方法时,和TestSuite(suit = unittest.TestSuite() suit.addTest())加用例时,
运行文件可能会报找不到该用例方法名的错误,原因是用ddt装饰器后会在用例的方法名加一些数据,会导致addTest找不到用例。
  
解决方式:使用unittest.defaultTestLoader.discover() 加载和运行testcase。
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号