✍个人博客:Pandaconda-CSDN博客
📣专栏地址:https://blog.csdn.net/newin2020/category_12903869.html
📚专栏简介:在这个专栏中,我将会分享测试开发面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

1. 请设计一个简单的基于 Python 的自动化测试框架,用于测试 Web 页面的元素交互,该框架需要具备元素定位、页面操作(如点击、输入等)、断言验证以及测试报告生成的功能。请阐述你的设计思路,并给出关键代码示例

答案:

设计思路:

  1. 元素定位模块:封装各种元素定位方法,如通过 id、class、xpath 等方式定位页面元素,提高代码的复用性。
  2. 页面操作模块:基于元素定位的结果,实现常见的页面操作,如点击元素、在输入框中输入文本等。
    断言验证模块:提供多种断言方法,用于验证页面操作的结果是否符合预期,例如验证元素是否存在、文本内容是否正确等。
  3. 测试用例管理模块:组织和管理测试用例,使用 Python 的测试框架(如 unittest 或 pytest)来定义和执行测试用例。
  4. 测试报告生成模块:选择合适的工具(如 HTMLTestRunner 或 Allure)生成详细的测试报告,展示测试结果。

关键代码示例(以 unittest 和 Selenium 为例,使用 HTMLTestRunner 生成报告):

import unittest
from selenium import webdriver
import HTMLTestRunner
import time

# 元素定位模块
class ElementLocator:
    def __init__(self, driver):
        self.driver = driver

    def find_element_by_id(self, element_id):
        return self.driver.find_element_by_id(element_id)

    def find_element_by_xpath(self, xpath):
        return self.driver.find_element_by_xpath(xpath)

# 页面操作模块
class PageOperator:
    def __init__(self, locator):
        self.locator = locator

    def click_element(self, element):
        element.click()

    def send_keys_to_element(self, element, text):
        element.send_keys(text)

# 断言验证模块
class Assertion:
    def assert_element_exists(self, element):
        try:
            element.is_displayed()
            return True
        except:
            return False

# 测试用例类
class WebPageTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.driver.get("https://www.example.com")  # 替换为实际测试页面
        cls.locator = ElementLocator(cls.driver)
        cls.operator = PageOperator(cls.locator)
        cls.assertion = Assertion()

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

    def test_page_interaction(self):
        element = self.locator.find_element_by_id("some_element_id")  # 替换为实际元素id
        self.operator.send_keys_to_element(element, "test text")
        self.operator.click_element(element)
        self.assertTrue(self.assertion.assert_element_exists(element))

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(WebPageTest)
    with open('test_report.html', 'w') as f:
        runner = HTMLTestRunner.HTMLTestRunner(stream=f, title='Web Page Test Report', description='Automated test report')
        runner.run(suite)

2. 在安全测试中,常见的 Web 应用安全漏洞有哪些?请选择其中一个漏洞,详细说明如何进行检测和防范

答案:

常见的 Web 应用安全漏洞包括:

  1. SQL 注入:攻击者通过在输入框中输入恶意的 SQL 语句,篡改数据库查询,获取敏感信息或执行非法操作。
  2. 跨站脚本攻击(XSS):攻击者将恶意脚本注入到网页中,当用户访问该网页时,脚本会在用户的浏览器中执行,可能导致用户信息泄露或会话劫持。
  3. 跨站请求伪造(CSRF):攻击者诱使用户在已登录的状态下访问恶意链接,从而以用户的身份执行非法操作。
  4. 文件上传漏洞:允许用户上传恶意文件,如脚本文件,从而获取服务器的控制权。
    信息泄露:如错误页面泄露服务器配置信息、敏感文件未授权访问等。

以 SQL 注入为例,说明检测和防范方法:

检测方法:

  1. 代码审计:审查应用程序的代码,查看数据库查询语句是否对用户输入进行了充分的验证和过滤。
  2. 黑盒测试:使用工具(如 SQLMap)或手动输入特殊字符(如单引号、分号等)和 SQL 语句片段,观察应用程序的响应,判断是否存在 SQL 注入漏洞。
  3. 白盒测试:结合代码分析和测试用例,覆盖所有可能的数据库查询路径,检查输入验证和过滤的有效性。

防范方法:

  1. 参数化查询:使用数据库提供的参数化查询功能,将用户输入作为参数传递,而不是直接拼接在 SQL 语句中。例如在 Python 的 psycopg2 库中:
import psycopg2

user_input = input("请输入用户名: ")
password = input("请输入密码: ")

try:
    conn = psycopg2.connect(database="your_database", user="your_user", password="your_password", host="your_host", port="your_port")
    cur = conn.cursor()
    cur.execute("SELECT * FROM users WHERE username = %s AND password = %s", (user_input, password))
    rows = cur.fetchall()
    for row in rows:
        print(row)
    cur.close()
    conn.close()
except (Exception, psycopg2.DatabaseError) as error:
    print(error)
  1. 输入验证和过滤:对用户输入进行严格的验证,只允许合法的字符和格式,过滤掉可能的恶意字符。
  2. 最小权限原则:为数据库用户分配最小的权限,避免攻击者获取过高的权限。

3. 请解释什么是数据驱动测试,并说明如何使用 Python 的 pytest 框架结合 pandas 库实现数据驱动测试,给出具体的示例代码

数据驱动测试的定义:数据驱动测试是一种测试方法,它使用不同的数据集来驱动测试用例的执行。通过提供多个输入数据和对应的预期输出,测试框架会针对每一组数据执行测试用例,以验证系统在不同数据情况下的正确性。

使用 pytest 框架结合 pandas 库实现数据驱动测试的步骤和示例代码:

  1. 安装必要的库:确保安装了 pytest 和 pandas 库。
  2. 准备测试数据:使用 pandas 读取数据文件(如 CSV 文件),将数据转换为适合测试的格式。
  3. 编写测试用例:使用 pytest 的 parametrize 装饰器,将测试数据传递给测试用例。

示例代码:

假设我们有一个 CSV 文件 test_data.csv,内容如下:

num1,num2,expected_result
2,3,5
5,3,8
10,2,12

测试代码如下:

import pytest
import pandas as pd

# 读取测试数据
data = pd.read_csv('test_data.csv')

@pytest.mark.parametrize("num1, num2, expected_result", zip(data['num1'], data['num2'], data['expected_result']))
def test_addition(num1, num2, expected_result):
    result = num1 + num2
    assert result == expected_result

在上述代码中,使用 pandas 读取 CSV 文件中的数据,然后通过 pytest 的 parametrize 装饰器将每一行数据作为参数传递给 test_addition 测试用例,实现了数据驱动测试。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐