【测试开发面试题】每日 3 题(六)
·
✍个人博客:Pandaconda-CSDN博客
📣专栏地址:https://blog.csdn.net/newin2020/category_12903869.html
📚专栏简介:在这个专栏中,我将会分享测试开发面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪
1. 请设计一个简单的基于 Python 的自动化测试框架,用于测试 Web 页面的元素交互,该框架需要具备元素定位、页面操作(如点击、输入等)、断言验证以及测试报告生成的功能。请阐述你的设计思路,并给出关键代码示例
答案:
设计思路:
- 元素定位模块:封装各种元素定位方法,如通过 id、class、xpath 等方式定位页面元素,提高代码的复用性。
- 页面操作模块:基于元素定位的结果,实现常见的页面操作,如点击元素、在输入框中输入文本等。
断言验证模块:提供多种断言方法,用于验证页面操作的结果是否符合预期,例如验证元素是否存在、文本内容是否正确等。 - 测试用例管理模块:组织和管理测试用例,使用 Python 的测试框架(如 unittest 或 pytest)来定义和执行测试用例。
- 测试报告生成模块:选择合适的工具(如 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 应用安全漏洞包括:
- SQL 注入:攻击者通过在输入框中输入恶意的 SQL 语句,篡改数据库查询,获取敏感信息或执行非法操作。
- 跨站脚本攻击(XSS):攻击者将恶意脚本注入到网页中,当用户访问该网页时,脚本会在用户的浏览器中执行,可能导致用户信息泄露或会话劫持。
- 跨站请求伪造(CSRF):攻击者诱使用户在已登录的状态下访问恶意链接,从而以用户的身份执行非法操作。
- 文件上传漏洞:允许用户上传恶意文件,如脚本文件,从而获取服务器的控制权。
信息泄露:如错误页面泄露服务器配置信息、敏感文件未授权访问等。
以 SQL 注入为例,说明检测和防范方法:
检测方法:
- 代码审计:审查应用程序的代码,查看数据库查询语句是否对用户输入进行了充分的验证和过滤。
- 黑盒测试:使用工具(如 SQLMap)或手动输入特殊字符(如单引号、分号等)和 SQL 语句片段,观察应用程序的响应,判断是否存在 SQL 注入漏洞。
- 白盒测试:结合代码分析和测试用例,覆盖所有可能的数据库查询路径,检查输入验证和过滤的有效性。
防范方法:
- 参数化查询:使用数据库提供的参数化查询功能,将用户输入作为参数传递,而不是直接拼接在 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)
- 输入验证和过滤:对用户输入进行严格的验证,只允许合法的字符和格式,过滤掉可能的恶意字符。
- 最小权限原则:为数据库用户分配最小的权限,避免攻击者获取过高的权限。
3. 请解释什么是数据驱动测试,并说明如何使用 Python 的 pytest 框架结合 pandas 库实现数据驱动测试,给出具体的示例代码
数据驱动测试的定义:数据驱动测试是一种测试方法,它使用不同的数据集来驱动测试用例的执行。通过提供多个输入数据和对应的预期输出,测试框架会针对每一组数据执行测试用例,以验证系统在不同数据情况下的正确性。
使用 pytest 框架结合 pandas 库实现数据驱动测试的步骤和示例代码:
- 安装必要的库:确保安装了 pytest 和 pandas 库。
- 准备测试数据:使用 pandas 读取数据文件(如 CSV 文件),将数据转换为适合测试的格式。
- 编写测试用例:使用 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 测试用例,实现了数据驱动测试。
更多推荐
所有评论(0)