测试工程师一面问题分享
1.装饰器的原理:
函数作为参数:装饰器本质上是一个函数,它接受一个函数作为参数。
内部函数:在装饰器函数内部,定义一个内部函数,用于包裹被装饰的函数。
闭包:内部函数可以访问外部函数的局部变量,并将其保持在内存中,形成了一个闭包。
2.pytest框架conftest.py的作用:
测试框架中的一个fixture,可以用作前置后置,conftest.py文件是pytest框架中用于定义项目级别夹具、配置插件和自定义命令行选项的地方。
它提供了一种集中管理和共享的方式,使得各个测试文件和插件可以方便地访问和使用这些夹具和配置。
3.if__name__==__main__:的作用:
if __name__ == "__main__" 是一个常见的Python代码块,它的作用是判断当前模块是否被直接运行(作为主程序执行),而不是被导入到其他模块中。
当Python脚本被直接执行时,__name__ 的值会被设置为字符串 "__main__"。而当Python脚本被导入到其他模块中时,__name__ 的值则为模块名(即文件名)。
使用 if __name__ == "__main__" 的主要目的是将一些执行特定任务的代码块限定在直接运行模块时执行,而在被导入时不执行,以避免不必要的副作用和执行时间开销。
4.列举一些常见的三方库:
pythonsql pytest, flask,sleep,os,unittest,allure-pytest
5.python2和python3的区别:
语法差异:Python 2 使用 print 作为语句,而 Python 3 将其变为了函数。例如,在 Python 2 中,print "Hello, World!" 是合法的,但在 Python 3 中,应该使用 print("Hello, World!")。
字符串处理:Python 2 默认使用 ASCII 编码,而 Python 3 默认使用 Unicode 编码,因此字符串处理方面有所不同。在 Python 3 中,字符串被视为 Unicode 字符序列,而在 Python 2 中,需要使用特殊语法来表示 Unicode 字符串。
整数除法:在 Python 2 中,整数除法运算的结果将自动向下取整,即 5 / 2 的结果是 2。而在 Python 3 中,整数除法运算结果将保留小数部分,即 5 / 2 的结果是 2.5。如果想在 Python 3 中进行向下取整的整数除法,可以使用 // 运算符。
异常处理:在 Python 2 中,异常处理使用关键字 as,如 except Exception as e。而在 Python 3 中,使用关键字 in,如 except Exception in e。这是一个语法上的差异。
xrange 和 range:Python 2 中有两种用于生成范围值的函数,xrange 和 range,其中 xrange 返回一个迭代器对象,而 range 直接返回一个列表。而在 Python 3 中,xrange 被移除,range 直接返回一个类似于 Python 2 中 xrange 的迭代器对象。
其他差异:还存在一些其他的差异,例如在输入函数中的 raw_input 和 input,以及在异常处理中的 raise 语法等
6.set和列表的区别:
顺序:列表是有序的,元素按照插入的顺序排列,并且可以通过索引访问元素。而集合是无序的,元素没有固定的顺序,不能通过索引访问。
唯一性:列表可以包含重复的元素,而集合中的元素是唯一的,不允许出现重复值。当你想要对一个序列进行去重操作时,使用集合是一个便捷的方式。
可变性:列表是可变的,即可以通过索引修改列表中的元素,添加或删除元素。而集合是可变的,可以添加或删除元素,但不能直接通过索引修改集合内的元素,因为集合没有定义元素位置。
存储方式:列表使用有序的索引来存储元素,而集合使用哈希表来存储元素。因此,判断一个元素是否在集合中的速度远快于在列表中。
应用场景:列表适用于需要按顺序存储和访问元素的情况,以及需要允许重复元素的情况。而集合适用于需要去重和快速判断元素是否存在的情况,不关心元素的顺序。
7.列表如何去重:
1.使用set
2.使用循环
8.python深拷贝浅拷贝
浅拷贝是创建一个新对象,该对象与原始对象共享内部对象(子对象)的引用。这意味着,当修改原始对象或其内部对象时,浅拷贝的对象也会受到影响。
深拷贝是创建一个新对象,并递归地复制原始对象及其内部对象,包括子对象。这样,原始对象和深拷贝的对象是完全独立的,对其中一个进行修改不会影响另一个。
9.pytest.mark.parametrize装饰器
定义参数化装饰器:pytest的参数化功能是通过pytest.mark.parametrize装饰器来实现的。该装饰器接受一个或多个参数名称和对应的值列表作为输入,并将这些参数值组合成多个测试用例。
应用装饰器:将@pytest.mark.parametrize装饰器应用到测试函数上,并传入参数名称和值列表。
参数化过程:当pytest执行测试时,它会检测到被参数化装饰器修饰的测试函数,
10.docker拉取本地仓库镜像前需要做什么操作?
启动本地仓库:首先,必须启动本地仓库服务。可以使用docker run命令启动一个本地仓库容器,如下所示:
bash
docker run -d -p 5000:5000 --name registry registry:2
这将启动一个名为registry的容器,并将其监听在localhost:5000地址上以提供本地仓库服务。
标记镜像:接着,必须使用docker tag命令标记要复制到本地仓库的镜像,如下所示:
bash
docker tag myimage localhost:5000/myimage
这将给镜像添加一个新标签,标识它应该被上传到localhost:5000地址上的本地仓库,并以myimage作为镜像名称。
上传镜像:最后,可以使用docker push命令将标记过的镜像上传到本地仓库,如下所示:
bash
docker push localhost:5000/myimage
这将复制该镜像及其所有层到本地仓库,使其可用于从本地仓库拉取。
一旦完成了这些步骤,就可以使用docker pull命令从本地仓库拉取镜像,如下所示:
bash
docker pull localhost:5000/myimage
11.总结三个你自己的优点
1.xxx
2.xxx
3.xxx
12.TCP三次握手和四次挥手,为什么会多一次,请说出你的理解
四次挥手需要双方确认数据传输完成,所以比三次握手多了一次
现在回答你的问题:为什么会多一次?
在四次挥手的第二步中,服务器发送一个ACK包作为对客户端发出的FIN包的响应,并进入CLOSE_WAIT状态。这个阶段服务器等待应用程序关闭连接,
如果应用程序不立即关闭连接,服务器会继续等待。只有当服务器的应用程序关闭连接后,服务器才会发送一个自己的FIN包,进行四次挥手的下一步。
因此,第二次挥手中的ACK包是服务器向客户端确认客户端发出的FIN包已接收的一种方式,它并不是建立连接时的三次握手的一部分。
13.左连接和右连接区别
左连接返回左表中的所有记录,右连接返回右表中的所有记录。
左连接保留左表中无论是否有匹配的记录,右连接保留右表中无论是否有匹配的记录。
在使用左连接时,左边的表是主表;在使用右连接时,右边的表是主表。
如果两个表中都存在匹配的记录,则左连接和右连接的结果是相同的。
14.shell查找一个文件然后删除
find /path/to/search -name "filename" -type f -exec rm {} \;
解释:
/path/to/search是要查找的目录路径,你需要将其替换为实际的目录路径。
"filename"是要查找并删除的文件名,你需要将其替换为实际的文件名。
-type f表示只查找普通文件,排除目录和其他类型的文件。
-exec rm {} \;表示对每个找到的文件执行rm命令进行删除操作。{}将被替换为实际的文件名,\;表示命令执行结束。
15.shell如何判断上一个命令的执行结果是否成功
在Shell中,可以通过特殊变量$?来获取上一个命令的执行结果。
$?保存着上一个命令的退出状态码(返回值),其中0表示成功,非零值表示失败或出错。
你可以通过以下方式判断上一个命令的执行结果是否成功:
shell
if [ $? -eq 0 ]; then
echo "上一个命令执行成功"
else
echo "上一个命令执行失败"
fi
16.正则表达式(截取字符串的前三位数字)
^\d{3}
解释:
^表示匹配字符串的开始位置。
\d表示匹配数字字符。
{3}表示匹配前面的模式(即数字字符)恰好出现3次。