测试用例 1

  • 测试对象: B站 (B站登录) https://passport.bilibili.com/login
  • 只简单测试了登录功能,而且还没完善, 没完善的内容是, B站登录需要一个验证码, 我这点没有实现, 所以是选择手动点击图片验证码,下面还有一个GitHub的登录测试用例, GitHub登录时不需要验证码
  • 分析b站的登录网页的数据结构
  • 输入账号的文本框在这里插入图片描述
  • 输入密码的文本框在这里插入图片描述
  • 登录的点击按钮在这里插入图片描述
  • 先创建一个测试用例文件 test_bilibili.py 文件,在里面编写测试用例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53

    """
    测试用例
    测试对象: B站 (B站登录) https://passport.bilibili.com/login
    """

    import unittest
    import time

    from parameterized import parameterized
    from selenium import webdriver


    class TestLogin(unittest.TestCase):
    """
    1. 打开浏览器 : 就使用 setUp(self)方法打开浏览器
    2. 查找用户名输入框
    3. 查找密码的输入框
    4. 点击登录
    5. 断言登录成功与否 使用登录后的页面上的用户名进行断言
    """
    def setUp(self) -> None:
    # 创建一个浏览器对象
    self.driver = webdriver.Chrome("../chromedriver.exe")
    # 发送请求
    self.driver.get("https://passport.bilibili.com/login")

    def tearDown(self) -> None:
    self.driver.close() # 关闭浏览器
    self.driver.quit() # 退出浏览器
    def test_login(self):
    # 创建账号登录信息
    username = "这里输入你的账号"
    password = "这里输入你的密码"

    # 查找输入账号的文本框, 并输入账号
    time.sleep(1)
    self.driver.find_element_by_id("login-username").clear() # 先清空文本框内容
    self.driver.find_element_by_id("login-username").send_keys(username) # 输入账号
    # 查找出入密码的文本框, 并输入密码
    time.sleep(1)
    self.driver.find_element_by_id("login-passwd").clear() # 先清空文本框的内容
    self.driver.find_element_by_id("login-passwd").send_keys(password) # 输入密码
    # 查找登录的按钮, 点击登录
    time.sleep(0.5)
    self.driver.find_element_by_class_name("btn-login").click()
    # 代码写到一半, 我发现登录需要一个图片验证码, 所以我决定图片验证码手动点一下, 这里延迟 10 秒进行手动点击
    time.sleep(10)
    # 断言登录是否成功
    handle = self.driver.current_window_handle
    self.driver.switch_to.window(handle)
    index = self.driver.find_element_by_xpath('//*[@id="primaryPageTab"]/ul/li[1]/a/span').text
    self.assertEqual(index, "首页", msg='登录失败')
  • 然后编写执行文件text_run.py 文件, 用来执行测试用例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    import unittest

    from BeautifulReport import BeautifulReport


    """
    使用run文件执行unittest 文件时, 可以直接导入
    这时 unittest 会自动查找导入问价中类去执行
    但是文件的开头以test 文件的类和函数也必须以test开头
    """

    if __name__ == '__main__':
    """
    defaultTestLoader
    使用unittest.defaultTestLoader()类, 这个类的作用就是,调用这个类的discover()方法, 搜索指定目录下指定开头的.py文件,
    并将搜索到的测试用例组装成一个测试集合, 听上去是不是和 TestSuite 的作用差不多
    """
    # 先确定一个要搜索的路径
    test_dir = "."
    # 然后创建集合对象
    dis = unittest.defaultTestLoader.discover(test_dir, pattern='test_bilibili.py')

    runner = BeautifulReport(dis)
    runner.report(
    description="b站登录",
    filename="bilibili_login" # 生成测试报告的文件名
    )
    这个只能输入一个账号, 看上去很不方便,我在介绍一个很好用的模块, 这个模块就像是一个装饰器
    先安装

    pip install parameterized

然后把测试用例test_bilibili.py改为如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

"""
测试用例
测试对象: B站 (B站登录) https://passport.bilibili.com/login
"""

import unittest
import time

from parameterized import parameterized
from selenium import webdriver


class TestLogin(unittest.TestCase):
"""
1. 打开浏览器 : 就使用 setUp(self)方法打开浏览器
2. 查找用户名输入框
3. 查找密码的输入框
4. 点击登录
5. 断言登录成功与否 使用登录后的页面上的用户名进行断言
"""
# 创建登录数据, 这里可以写多个账号进行测试
data = [
('账号', '密码'),
('账号', '密码'),
('账号', '密码'),
]
def setUp(self) -> None:
# 创建一个浏览器对象
self.driver = webdriver.Chrome("../chromedriver.exe")
# 发送请求
self.driver.get("https://passport.bilibili.com/login")

def tearDown(self) -> None:
self.driver.close() # 关闭浏览器
self.driver.quit() # 退出浏览器

@parameterized.expand(data)
def test_login(self, username, password):
# 查找输入账号的文本框, 并输入账号
time.sleep(1)
self.driver.find_element_by_id("login-username").clear() # 先清空文本框内容
self.driver.find_element_by_id("login-username").send_keys(username) # 输入账号
# 查找出入密码的文本框, 并输入密码
time.sleep(1)
self.driver.find_element_by_id("login-passwd").clear() # 先清空文本框的内容
self.driver.find_element_by_id("login-passwd").send_keys(password) # 输入密码
# 查找登录的按钮, 点击登录
time.sleep(0.5)
self.driver.find_element_by_class_name("btn-login").click()
# 代码写到一半, 我发现登录需要一个图片验证码, 所以我决定图片验证码手动点一下
time.sleep(10)
# 断言登录是否成功
handle = self.driver.current_window_handle
self.driver.switch_to.window(handle)
index = self.driver.find_element_by_xpath('//*[@id="primaryPageTab"]/ul/li[1]/a/span').text
# # 进行断言, 如果在登录后的界面出现"首页"二字,就代表成功.否则视为失败
self.assertEqual(index, "首页", msg='登录失败')
  • 整个测试的流程已经写完了, 有很大的瑕疵, 就在没有完成自动点击图片验证, 直接看下一个吧

    测试用例 2

  • 测试对象: GitHub (登录) https://github.com/login
  • 先分析网页结构,查找登录时账号的文本输入框
  • 在这里插入图片描述
  • 在定位密码的输入文本框
  • 在这里插入图片描述
  • 在 定位登录按钮
  • 在这里插入图片描述
  • 登录成功后进行断言, 如果在登录后的界面出现你的用户名,就代表成功.否则视为失败
  • 在这里插入图片描述
    在这里插入图片描述
    创建测试用例文件 test_git.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56

    """
    测试用例
    测试对象: github https://github.com/login
    """

    import unittest
    import time

    from parameterized import parameterized
    from selenium import webdriver


    class TestLogin(unittest.TestCase):
    """
    1. 打开浏览器 : 就使用 setUp(self)方法打开浏览器
    2. 查找用户名输入框
    3. 查找密码的输入框
    4. 点击登录
    5. 断言登录成功与否 使用登录后的页面上的用户名进行断言
    """
    # 创建登录数据
    data = [
    ("账号", "密码"),
    ('sssssss-dss', 'nisshui1'),

    ]
    def setUp(self) -> None:
    # 创建一个浏览器对象
    self.driver = webdriver.Chrome("../chromedriver.exe")
    # 发送请求
    self.driver.get("https://github.com/login")

    def tearDown(self) -> None:
    self.driver.close() # 关闭浏览器
    self.driver.quit() # 退出浏览器

    @parameterized.expand(data)
    def test_login(self, username, password):
    time.sleep(1)
    self.driver.find_element_by_id("login_field").clear() # 先清空文本框内容
    self.driver.find_element_by_id("login_field").send_keys(username) # 输入账号
    # 查找出入密码的文本框, 并输入密码
    time.sleep(1)
    self.driver.find_element_by_id("password").clear() # 先清空文本框的内容
    self.driver.find_element_by_id("password").send_keys(password) # 输入密码
    # 查找登录的按钮, 点击登录
    time.sleep(0.5)
    self.driver.find_element_by_class_name("btn-primary").click()
    time.sleep(1)
    # 断言登录是否成功
    handle = self.driver.current_window_handle
    self.driver.switch_to.window(handle)
    index = self.driver.find_element_by_xpath("//span[@class='flex-shrink-0 css-truncate css-truncate-target']").text
    # 进行断言, 如果在登录后的界面出现你的用户名,就代表成功.否则视为失败
    self.assertEqual(index, username, msg='登录失败')
    编写执行文件 test_git_run.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    import unittest
    from BeautifulReport import BeautifulReport

    """
    使用run文件执行unittest 文件时, 可以直接导入
    这时 unittest 会自动查找导入问价中类去执行
    但是文件的开头以test 文件的类和函数也必须以test开头
    """

    if __name__ == '__main__':
    """
    defaultTestLoader
    使用unittest.defaultTestLoader()类, 这个类的作用就是,调用这个类的discover()方法, 搜索指定目录下指定开头的.py文件,
    并将搜索到的测试用例组装成一个测试集合, 听上去是不是和 TestSuite 的作用差不多
    """
    # 先确定一个要搜索的路径
    test_dir = "."
    # 然后创建集合对象
    dis = unittest.defaultTestLoader.discover(test_dir, pattern='test_git.py')

    runner = BeautifulReport(dis)
    runner.report(
    description="Github 登录",
    filename="Github_login" # 生成测试报告的文件名
    )

    我只使用了两个账号信息, 一对一错, 测试报告如下
    在这里插入图片描述