【unittest单元测试框架】(3)unittest 编写 Web 自动化测试


unittest 编写 Web 自动化测试

  我们学习 unittest 的目的是用它编写 Web 自动化测试用例,所以接下来会将 unittest 与Selenium 结合起来进行 Web 自动化测试。   创建 test_baidu.py 文件。   这里将百度首页的访问和搜索过程封装成一个 baidu_search()方法,并定义 search_key参数为搜索关键字,根据接收的关键字执行不同内容的搜索。这里的 baidu_search()方法会被当作测试用例执行吗?当然不会,因为根据 unittest 查找和执行测试用例的规则,它只会把以“test”开头的方法当作测试用例。   另一个值得讨论的问题是,测试用例的断言要不要写在封装的方法中?从前面的代码可以看出,测试的断言点是一样的。不过,笔者更倾向于把断言写在每一条测试用例里面,因为很多时候就算操作步骤是一样的,断言点也不完全一样。例如,登录功能的测试用例,虽然操作步骤相同,但是用户名为空和密码为空,这两条测试用例的提示信息可能显示在不同的位置,所以获取提示信息的定位方法是不一样的,因此断言也就不完全一样了。另外,从设计的角度来看,断言写在每一个测试用例中也会更加清晰。我们发现每一条测试用例都要启动和关闭一次浏览器,这是非常耗时的,那么如何减少浏览器的启动和关闭次数呢?利用前面学过的setUpClass/tearDownClass可以解决这个问题。
# -*- coding:utf-8 -*-
# filename: test_baidu.py
# author: hello.yin
# create time: 2021/11/16 17:31

import unittest
from time import sleep
from selenium import webdriver


class BaiduTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Firefox()
        cls.base_url = "https://www.baidu.com"

    def baidu_search(self, search_key):
        self.driver.get(self.base_url)
        self.driver.find_element_by_id("kw").clear()
        self.driver.find_element_by_id("kw").send_keys(search_key)
        self.driver.find_element_by_id("su").click()
        sleep(2)

    def test_selenium(self):
        search_key = "selenium"
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    def test_unittest(self):
        search_key = "unittest"
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()


if __name__ == "__main__":
    unittest.main(verbosity=2)
虽然我们将 driver 驱动定义为 cls.driver,但是在每个测试用例中使用时依然为self.driver。当整个测试类中的所有测试用例都运行完成后,会调用 cls.driver.quit()关闭浏览器。当一个测试类中有多条测试用例时,这种方式将大大缩短测试用例的执行时间。

 执行结果:

Testing started at 17:48 ...
C:\Users\yzp\AppData\Local\Programs\Python\Python37\python.exe "C:\Program Files\JetBrains\PyCharm 2018.2\helpers\pycharm\_jb_unittest_runner.py" --path D:/00test/base_practice/practice/test_baidu.py
Launching unittests with arguments python -m unittest D:/00test/base_practice/practice/test_baidu.py in D:\00test\base_practice\practice


Ran 2 tests in 18.546s

OK

Process finished with exit code 0