Web软件测试面试总结

发布于:2024-03-29 ⋅ 阅读:(21) ⋅ 点赞:(0)

整理下最近遇到的Web软件测试会被问到的问题,来自测下你掌握得怎么样?

一、编程语言相关

1、字符串反转

s = "I am Donny"
reversed_s = s[::-1]
print(reversed_s)

这将输出 “ynnoD ma I”。

2、基础数据类型
基本数据类型(Primitive Data Types)是编程语言中最基本的数据类型,通常用于存储简单的数值或值。在大多数编程语言中,基本数据类型包括整数、浮点数、布尔值和字符等。下面是常见的基本数据类型及其在 Python 中的对应:
整数类型(Integer):用于表示整数值,如 1、2、-3 等。
在 Python 中,整数类型对应的是 int。
浮点数类型(Float):用于表示带有小数点的数值,如 3.14、2.0 等。
在 Python 中,浮点数类型对应的是 float。
布尔类型(Boolean):用于表示真值或假值,通常为 True 或 False。
在 Python 中,布尔类型对应的是 bool。
字符类型(Character):用于表示单个字符,如 ‘a’、‘b’ 等。
在 Python 中,字符类型对应的是 str,但字符串中只包含一个字符时,也可以被视为字符类型。
这些基本数据类型通常用于存储简单的数据值,并在计算、比较、逻辑判断等方面发挥作用。在 Python 中,由于其动态类型特性,变量的数据类型通常是根据赋给它们的值自动推断的,因此不需要显式声明变量的数据类型。

3、Python的数据去重
**(1)使用集合(Set):**集合是一种无序且不重复的数据结构,因此可以利用集合的特性来去除重复元素。

original_list = [1, 2, 3, 3, 4, 5, 5]
unique_set = set(original_list)
unique_list = list(unique_set)
print(unique_list)  # 输出:[1, 2, 3, 4, 5]

**使用列表推导式(List Comprehension):**通过列表推导式遍历原始列表,将不重复的元素添加到新列表中。

original_list = [1, 2, 3, 3, 4, 5, 5]
unique_list = []
[unique_list.append(x) for x in original_list if x not in unique_list]
print(unique_list)  # 输出:[1, 2, 3, 4, 5]

(1)使用循环:通过循环遍历原始列表,将不重复的元素添加到新列表中。

original_list = [1, 2, 3, 3, 4, 5, 5]
unique_list = []
for x in original_list:
    if x not in unique_list:
        unique_list.append(x)
print(unique_list)  # 输出:[1, 2, 3, 4, 5]

(2)使用 collections.Counter:Counter 是 Python 的一个计数器工具,可以用来统计元素出现的次数,利用它的特性也可以去重。

from collections import Counter
original_list = [1, 2, 3, 3, 4, 5, 5]
counter = Counter(original_list)
unique_list = list(counter.keys())
print(unique_list)  # 输出:[1, 2, 3, 4, 5]

这些方法都可以对数据进行去重,选择合适的方法取决于具体的应用场景和个人偏好。通常来说,使用集合是最简单和最高效的方法。

4、 list[a,a,b,b,c,c,d,f] ,去重后,输出新的列表.

def remove_duplicat_char(input_strs):
    # 创建一个空字典,用于记录每个字符出现的次数
    chars_count = {}
    # 创建一个空字符串,用于存储最终结果
    result1 = ' '

    # 第一次循环:统计每个字符出现的次数,并将结果存储在字典 chars_count 中
    for char in input_strs:
        chars_count[char] = chars_count.get(char, 0) + 1
        # 打印每个字符的出现次数
        print(chars_count)

    # 第二次循环:遍历输入字符串中的每个字符,如果其在 chars_count 中出现的次数为 1,则将其添加到结果字符串 result1 中
    for char in input_strs:
        if chars_count[char] == 1:
            result1 += char

    # 返回结果字符串
    return result1

5、list: [0,1,2,3,4,5,6,7,8,9] 每个元素作如下操作:x*2+2, 将操作后的结果按照列表输出

original_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
modified_list = []
for x in original_list:
    modified_list.append(x * 2 + 2)
print("Original list:", original_list)
print("Modified list:", modified_list)

6、浅拷贝 深拷贝
在编程中,浅拷贝(Shallow Copy)和深拷贝(Deep Copy)是两种常见的复制数据的方式,它们的区别在于复制的深度和复制的方式。
(1)浅拷贝:
浅拷贝创建一个新的对象,并将原始对象中的元素复制到新对象中。但是,如果元素本身是一个对象,浅拷贝只会复制这个对象的引用,而不会复制对象本身。因此,对于原始对象和浅拷贝后的对象来说,它们共享同一组对象引用。如果修改了原始对象中的对象,那么浅拷贝后的对象中的对应元素也会受到影响。在许多编程语言中,如 Python 中的 copy() 方法或 Java 中的 clone() 方法,通常实现的是浅拷贝。
(2)深拷贝:
深拷贝创建一个新的对象,并递归地复制原始对象中的所有元素及其子元素,直到复制了整个对象图(Object Graph)。
因此,对于原始对象和深拷贝后的对象来说,它们拥有完全独立的对象引用,修改其中一个对象不会影响另一个对象。
实现深拷贝的方法通常需要递归地遍历原始对象中的所有对象,并复制每一个对象及其子对象。在某些编程语言中,如 Python 中的 copy.deepcopy() 方法,专门用于执行深拷贝操作。
总之,浅拷贝只复制了对象的顶层结构,而深拷贝则会递归复制整个对象图,包括所有的子对象。因此,在选择使用哪种拷贝方式时,需要根据具体的需求和数据结构来决定。

7、内变量、实例变量区别
实例变量是属于对象的变量,每个对象都有自己的实例变量副本,而局部变量是在方法、构造函数或块内部声明的临时变量,其作用域和生命周期受限于声明它们的方法、构造函数或块。

二、自动化测试相关
1、selenium搜索结果获取后,切换到其他界面再回来,获取的搜索结果还能继续用吗。

一旦你切换到其他界面并返回,之前获取的搜索结果通常不会再有效。这是因为 Selenium WebDriver 是基于浏览器的自动化工具,它在切换页面后会丢失对之前页面的引用,导致之前获取的元素对象失效。
在切换到其他界面后,如果想要继续操作之前的搜索结果,你需要重新获取这些结果。你可以通过相同的查找元素的方法重新定位这些元素,然后再进行操作。
一种方法是在每次操作后都重新搜索获取结果,确保你始终操作的是最新的元素。另一种方法是在切换页面之前,将需要操作的元素保存在变量中,这样即使切换页面后,你也可以使用这些变量来操作元素。

综上所述,当切换到其他页面后,之前获取的搜索结果不再有效,需要重新获取。

2、pytest fixture scop 作用域
Fixture 是一种用于为测试函数提供预设条件的机制,而 Fixture 的作用域(Scope)则指定了 Fixture 在整个测试会话中的生命周期。Pytest 提供了四种不同的 Fixture 作用域,分别是:function、class、module 和 session

3、接口中Params和Data区别

在接口请求中,params 和 data 是两种常用的传递参数的方式,它们的区别如下:
(1)params:
通常用于 GET 请求中,用于在 URL 中传递查询参数。
参数会被编码到 URL 的查询字符串中,形式为 key1=value1&key2=value2。
适合传递简单的键值对参数,如过滤条件、排序参数等。
示例:

import requests

url = 'http://example.com/api'
params = {'param1': 'value1', 'param2': 'value2'}
response = requests.get(url, params=params)

(2)data:
通常用于 POST 请求中,用于向服务器提交表单数据或者其他类型的数据。
参数会被放置在请求体中进行传输,可以是字典形式(application/x-www-form-urlencoded)或者 JSON 格式(application/json)。
适合传递复杂的结构化数据,如表单数据、JSON 数据等。
示例:

import requests


url = 'http://example.com/api'
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post(url, data=data)

总结:
params 通常用于 GET 请求,在 URL 中传递简单的查询参数。
data 通常用于 POST 请求,在请求体中传递复杂的结构化数据。

4、Pytest怎么执行特定某一个用例
(1)使用参数k来运行
假设你有一个名为 test_sample.py 的测试文件,其中包含一个测试函数 test_login,你可以通过以下命令执行该测试用例:

pytest -k test_login test_sample.py

(2)使用nodeid来运行
nodeid由模块命,分隔符,类名,方法名,函数名组成 pytest -vs ./testcase ./testcase/test_loginFail.py::TestLoginFail::test_02

三、数据库

1、学生表里面有学生id,和学生成绩及课程名,查询成绩第三名的学生id

SELECT student_id
FROM students
ORDER BY score DESC
LIMIT 1 OFFSET 2;

2、查询比小明金额大的人数
假设数据库名为transactions,小明金额为1000,最简单的:

SELECT COUNT(*)
FROM transactions
WHERE amount > 1000;

四、Linux系统
1、Linux 怎么获取动态日志:
(动态日志是指在应用程序运行过程中实时产生的日志信息。与静态日志不同,静态日志是在特定时间点记录的日志,通常是一段时间内的操作记录或者错误信息。而动态日志则是在程序运行期间持续产生的日志,可以用于实时监控应用程序的运行状态、调试问题、分析性能等。)
(1)tail 命令:
使用 tail 命令可以查看文件的尾部内容,包括实时动态日志。常见的用法是通过 -f 参数来实时跟踪文件内容的变化。

tail -f /path/to/logfile.log

这会持续显示 logfile.log 文件的新内容,直到手动中断。

(2)journalctl 命令:
如果你使用的是 systemd 日志服务,可以使用 journalctl 命令来查看系统日志。同样,可以通过 -f 参数来实时跟踪日志的变化。

journalctl -f

(3)less 或 more 命令:
使用 less 或 more 命令可以按页查看文件内容,其中 less 具有更多的交互功能,如搜索、滚动等。

less /path/to/logfile.log

(4)tailf 命令:
在一些系统中可能还会有 tailf 命令,它与 tail -f 类似,用于实时跟踪文件内容的变化。

tailf /path/to/logfile.log

通过以上方法,你可以在 Linux 中实时跟踪动态日志的变化,便于监控系统和应用程序的运行状态。

五、测试用例设计
注册页面(手机号、用户名、密码、确认密码、短信验证码、图形验证码)的测试设计:
1、功能测试:
(1)手机号码验证:
输入有效的手机号码,应该显示验证通过。
输入无效的手机号码(格式不正确、已被注册等),应该显示相应的错误提示。
(2)用户名验证:
输入合法的用户名(字母、数字、下划线等组合),应该显示验证通过。
输入无效的用户名(包含特殊字符、长度过长等),应该显示相应的错误提示。
(3)密码验证:
输入符合要求的密码(包含字母、数字、特殊字符,长度符合要求),应该显示验证通过。
输入不符合要求的密码(过于简单、长度不足等),应该显示相应的错误提示。
(4)确认密码验证:
输入与密码一致的确认密码,应该显示验证通过。
输入与密码不一致的确认密码,应该显示相应的错误提示。
(5)短信验证码验证:
输入正确的短信验证码,应该显示验证通过。
输入错误的短信验证码,应该显示相应的错误提示。
(6)图形验证码验证:
输入正确的图形验证码,应该显示验证通过。
输入错误的图形验证码,应该显示相应的错误提示。
(7)注册按钮:
点击注册按钮时,所有必填字段都已填写且验证通过,应该成功提交注册请求。
点击注册按钮时,如果有任何必填字段未填写或者填写错误,应该显示相应的错误提示。
(8)服务条款:
如果有服务条款需要勾选或者同意,测试用户是否可以正常勾选或者同意。

2、兼容性测试:
在不同的浏览器(Chrome、Firefox、Safari、Edge等)和操作系统(Windows、Mac、iOS、Android等)上测试注册页面的兼容性,确保页面在各种环境下都能够正常显示和操作。

3、性能测试:
测试注册页面的加载速度和性能表现,包括页面加载时间、响应时间、并发用户数量等指标,以确保页面能够在高负载情况下稳定运行。

4、安全性测试:
进行安全性测试,包括检查是否存在常见的安全漏洞(如跨站脚本攻击、SQL注入攻击等),确保用户输入的信息得到有效的保护和加密。
5、用户体验测试:
进行用户体验测试,评估注册页面的易用性、直观性和友好性,确保用户能够轻松地完成注册流程,并且不会因为页面设计或者操作流程而感到困惑或者不满意。
6、多语言测试:
如果注册页面支持多种语言,测试各个语言版本的翻译质量和排版效果,确保页面在不同语言环境下都能够正常显示和操作。
7、移动端测试:
如果注册页面支持移动设备访问,测试页面在不同移动设备(手机、平板)和不同操作系统(iOS、Android)上的显示效果和操作体验,确保页面在移动端的兼容性和友好性。
8、容错测试:
测试注册页面对用户错误输入的处理能力,包括输入错误格式的手机号码、用户名、密码等,以及在网络不稳定或者服务器出现故障时的页面表现,确保页面能够正确地处理各种异常情况。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到