• [测试] selenium自动化测试2


    1.unittest框架

    unittest是一个python版本的junit,junit是java中的单元测试框架

    UI 功能单元测试

    该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果

    (1)测试固件(框架里面的固定方法)

    setup 方法,测试环境和数据的准备工作

    tearDown 做测试用例执行完之后的清理工作

    (2)测试用例

    一个用例是一个方法 ,def 名字以test_ 开头

    (3)测试套件

    把测试用例组织到一起进行一个整体的测试

    必须以继承的方式来使用,Python也是一种面向对象的语言

    1. from selenium import webdriver
    2. import unittest
    3. import time
    4. import os
    5. from selenium.common.exceptions import NoAlertPresentException
    6. from selenium.common.exceptions import NoSuchElementException
    7. class Baidu1(unittest.TestCase):
    8. # 测试固件
    9. def setUp(self):
    10. print("-----setUp-----")
    11. self.driver = webdriver.Chrome()
    12. self.url = "https://www.baidu.com/"
    13. self.driver.maximize_window()
    14. time.sleep(3)
    15. def tearDown(self):
    16. print("-----tearDown-----")
    17. self.driver.quit()
    18. # 测试用例
    19. # 忽略测试用例的执行
    20. # @unittest.skip("skipping")
    21. def test_hao(self):
    22. driver = self.driver
    23. url = self.url
    24. driver.get(url)
    25. driver.find_element_by_link_text("hao123").click()
    26. time.sleep(6)
    27. def test_hbaidu(self):
    28. driver = self.driver
    29. url = self.url
    30. driver.get(url)
    31. # self.assertEqual("突如其来的假期_百度搜索", driver.title, msg="实际结果和预期结果不一致" )
    32. self.assertTrue("百度一下,你就知道" == driver.title, msg="不一致!!!")
    33. driver.find_element_by_id("kw").send_keys("突如其来的假期")
    34. driver.find_element_by_id("su").submit()
    35. time.sleep(5)
    36. print(driver.title)
    37. # self.assertEqual(driver.title, "突如其来的假期_百度搜索", msg="实际结果和预期结果不一致" )
    38. time.sleep(6)
    39. def saveScreenAsPhoto(self, driver, file_name):
    40. if not os.path.exists("./image"):
    41. os.makedirs("./image")
    42. now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
    43. driver.get_screenshot_as_file("./image/" + now + "-" + file_name)
    44. time.sleep(3)
    45. if __name__ == "__main__":
    46. unittest.main()

    2.测试套件

    (1)unittest.TestSuite

    addTest(脚本名称.类名称.方法名) 一个方法一个方法的添加

    makesuit:

    unittest.makeSuite(脚本名称.类名称)可以把一个类中所有的测试方法添加到测试套件中

    TestLoader:

    unittest.TestLoader().loadTestsFromTestCase 把一个类中所有的测试方法创建成一个测试套件返回

    (2)把一个文件夹下所有测试脚本的测试用例都执行一遍

    discover

    1. import unittest
    2. from src20211230 import testbaidu2
    3. from src20211230 import testbaidu1
    4. def creatSuit():
    5. # 要把不同的测试脚本的类中的需要执行的方法放在一个测试套件中
    6. # suit = unittest.TestSuite()
    7. # suit.addTest(testbaidu1.Baidu1("test_hao"))
    8. # suit.addTest(testbaidu2.Baidu2("test_hao"))
    9. # suit.addTest(testbaidu2.Baidu2("test_haidusearch"))
    10. # return suit
    11. #如果我需要把一个测试脚本中年所有的测试用例都添加到suit中,怎么做?
    12. # makeSuit
    13. # suit = unittest.TestSuite()
    14. # suit.addTest(unittest.makeSuite(testbaidu1.Baidu1))
    15. # suit.addTest(unittest.makeSuite(testbaidu2.Baidu2))
    16. # return suit
    17. # TestLoader
    18. # suit1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1)
    19. # suit2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2)
    20. # suit = unittest.TestSuite([suit1, suit2])
    21. # return suit
    22. # 可以把一个文件夹下面所有的测试脚本中的测试用例放入测试套件
    23. discover = unittest.defaultTestLoader.discover("../src20211230", pattern="testbaidu*.py", top_level_dir=None)
    24. return discover
    25. if __name__ == "__main__":
    26. suit = creatSuit()
    27. # verbersity= 0, 1, 2
    28. # 数字1代表运行后的提示信息粗略 2代表运行失败后会详细写出哪里出现错了 0只会把错误的打印出来
    29. runner = unittest.TextTestRunner(verbosity=2)
    30. runner.run(suit)

    3.测试用例的执行顺序

    0~9 A~Z a~z

    测试方法名称

    4.忽略测试用例的执行

    对于不想运行的测试用例打标签:

    @unittest.skip("skipping")

    5.unittest断言

    测试用例的要素都有哪些?

    测试步骤、测试数据、测试环境、预期结果

    测试的最终结果其实就是判断实际结果和预期结果(符合需求标准)是否相符

    断言:判断实际结果和预期结果是否相符合,(眼睛和大脑)

    1. self.assertEqual(arg1,arg2,msg = '') # 预判表达式arg1,arg2相等
    2. self.assertNotEqual(arg1,arg2,msg = '') # 预判表达式arg1,arg2不相等
    3. self.assertTrue(arg1,msg = '') # 预判表达式arg1为真
    4. self.assertFalse(arg1,msg = '') # 预判表达式arg1为假

    6.HTML报告

    运行一个测试套件,里面有上百个测试用例如何集中并且清晰的查看测试用例执行结果?

    生成HTML报告的步骤:

    • 需要创建一个存放HTML报告的文件夹
    curpath = sys.path[0] # 写在if __name__=="__main__" 中
    1. # 当前路径下resultreport文件夹不存在的时候,就创建一个
    2. if not os.path.exists(curpath+'/resultreport'):
    3. os.makedirs(curpath+'/resultreport')
    • 解决重复命名的问题(用当前时间来命名)
    1. now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
    2. filename = curpath + '/resultreport/'+ now + 'resultreport.html'
    • 报告的输出
    1. # 使用HTMLTestRunner 要导入包import HTMLTestRunner
    2. with open(filename, 'wb') as fp:
    3. runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"测试报告",
    4. description=u"用例执行情况", verbosity=2)
    5. suite = createsuite()
    6. runner.run(suite)

    7.异常捕捉和错误截图

    目的:保留测试结果现场

    ./image “ . ”代表当前文件所在的路径下

    1. try:
    2. self.assertEqual(driver.title, u"百度一下,你就知道", msg="不相等")
    3. except:
    4. self.saveScreenShot(driver, "hao.png") # 出现异常就调用截图函数进行截图

    错误截图API:get_screenshot_as_file()

    1. # 截图函数
    2. def saveScreenShot(self, driver, file_name): # 参数:驱动,截图名字
    3. if not os.path.exists("./image"):
    4. os.makedirs("./image")
    5. now = time.strftime("%Y%m%d-%H%M%S", time.localtime(time.time()))
    6. driver.get_screenshot_as_file("./image/"+now+"-"+file_name)
    7. time.sleep(3)

    8.数据驱动

    数据驱动就是 用测试数据来驱动测试用例代码执行

    (1)安装ddt

    (2)导包

    from ddt import ddt, unpack, data, file_data

    (3)数据驱动的方式

    @data(value) 一次性传一个参数,括号中写参数

    @data(value1,value2.....)一次性传多个参数,需要用@unpack映射

    @file_data("json文件")

    @data(*解析数据的方法(txt/csv文件))

  • 相关阅读:
    【C++】进阶模板
    飞书发布多款业务产品 为企业提供最强降本增效工具
    MyBatis介绍和基础案例(有代码)
    Linux上编译sqlite3库出现undefined reference to `sqlite3_column_table_name‘
    Y=AX+B问题
    echarts折线图(其他图也是一样)设置tooltip自动滚动
    iBooker 技术评论 20230909
    【机器学习2】模型评估
    【SQL】优化SQL查询方法
    A. Marathon
  • 原文地址:https://blog.csdn.net/weixin_61567666/article/details/125555591