笔试面试的内容没有全部写全,有的已经记不得了。只贴通用性的技术相关的笔试面试题,至于说测试理论和团队管理的问题,没有写出来,都是大同小异,也没什么实际的参考价值。
class Person:
def __init__(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age
class Student(Person):
def __init__(self, name, gender, age,score):
super(Student, self).__init__(name, gender, age)
self.score = score
People = [kathy, Jim, John, Alice, Leo]
1、Python 的高阶函数包括:
2、生成器(Generator)是一种特殊的迭代器,它可以用于按需生成数据,而不是一次性生成所有数据。迭代器(Iterator)是访问集合元素的一种方式,它提供了一个统一的接口来遍历容器对象的元素。装饰器(Decorator)是 Python 中用于在不改变原函数代码的情况下,给函数动态添加功能的一种语法。
3、将字符串转化为整型可以使用 int() 函数,例如:num = int("123")
。如果字符串不能被正确转化为整型,则会抛出 ValueError 异常。
4、TCP 三次握手和四次挥手:
5、HTTP 常见的状态码包括:
6、webdriver 的核心原理是通过与浏览器进行通信,控制浏览器的行为和获取浏览器中的信息。它通过自动化驱动程序,如 ChromeDriver、GeckoDriver 等,与浏览器建立连接,并通过命令传递操作指令给浏览器。
7、Appium 是一个开源的移动应用自动化测试框架,主要用于自动化测试移动应用程序。它可以用于测试 iOS 和 Android 平台上的原生应用、混合应用和移动网页应用。Appium 的核心原理是通过发送特定的命令到移动设备或模拟器上来进行操作,如模拟点击、输入文本等。
8、Selenium1 和 Selenium2(也称为 Selenium WebDriver)的区别在于:
Selenium1 采用的是基于 JavaScript 的自动化测试框架,通过模拟用户的操作来进行测试。它可以与各种浏览器交互,但是与浏览器的通信是通过 JavaScript 脚本实现的。因此,Selenium1 的性能较慢,并且对浏览器的兼容性有限。
Selenium2(WebDriver)是一个基于原生浏览器的自动化测试框架。它直接与浏览器进行通信,而不是通过 JavaScript 脚本。通过浏览器的原生支持,Selenium WebDriver 可以更快地执行测试操作,并且具有更好的兼容性。
所以为了提高性能和扩展性,Selenium 社区决定抛弃 Selenium1 并转向 Selenium WebDriver。
Selenium1 的缺陷包括:
通过使用 Selenium WebDriver,这些问题得到了解决,并提供了更好的性能、更广泛的浏览器支持以及更友好的 API,使得自动化测试变得更加高效和便捷。
9、常见的元素定位方法包括:
find_element_by_id()
方法进行操作。find_element_by_name()
方法进行操作。find_element_by_class_name()
方法进行操作。find_element_by_tag_name()
方法进行操作。find_element_by_link_text()
方法进行操作。find_element_by_partial_link_text()
方法进行操作。find_element_by_css_selector()
方法进行操作。find_element_by_xpath()
方法进行操作。10、冒泡排序的实现:
def bubble_sort(arr):
n = len(arr)
for i in range(n - 1):
for j in range(n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
时间复杂度:最好情况下是O(n),即列表已经是有序的;最坏情况下是O(n^2),即列表逆序排序;平均情况下是O(n^2)。
空间复杂度:O(1)。
快速排序的实现:
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
时间复杂度:最坏情况下是O(n^2),即列表已经是有序或逆序排序;平均情况下是O(nlogn)。
空间复杂度:最坏情况下是O(n),平均情况下是O(logn)。
这两个算法都是稳定的,即相等元素的相对顺序在排序前后保持不变。
11、查询 Linux 后台日志的命令可以使用tail
命令,例如:
tail -n 100 /path/to/logfile
这个命令将显示日志文件的最后 100 行内容。
12、查看当前进程的命令可以使用ps
命令,例如:
ps aux
这个命令将显示当前系统的所有进程列表。
13、Dockerfile 是用于构建 Docker 镜像的文本文件,它包含了一系列指令和配置,用于定义镜像的构建流程。通过 Dockerfile,可以自动化地构建、部署和管理 Docker 镜像。
创建一个 Dockerfile 的步骤:
docker build
命令来构建镜像,例如docker build -t image_name:tag .
。14、Python 有垃圾回收机制,它的垃圾回收是通过引用计数和循环垃圾回收来实现的。
15、TESTNG 是一个功能强大的 Java 测试框架,它提供了丰富的注解、断言和报告功能,使得测试编写、执行和管理更加灵活和方便。下面是一些 TESTNG 的用法:
定义测试:
@Test
注解来标记测试方法。@BeforeSuite
、@AfterSuite
、@BeforeTest
、@AfterTest
等注解来标记测试套件级别和测试级别的前置条件和后置操作方法。@DataProvider
注解来提供测试数据。配置测试:
@BeforeClass
、@AfterClass
、@BeforeMethod
、@AfterMethod
等注解来标记测试类和测试方法级别的前置条件和后置操作方法。@Parameters
注解来定义测试方法的参数。执行测试:
TestNG.xml
配置文件来指定执行的测试套件、测试类、测试方法等。testng
命令来执行 TestNG 测试。断言和报告:
assertEquals()
、assertTrue()
等。通过使用 TESTNG,可以实现灵活的测试编写和管理,提高测试的可读性和可维护性,同时还能生成详尽的测试报告,方便问题追踪和分析。
16、JAVA 单例模式的实现可以有多种方式,以下是一种常见的基于懒汉式的单例模式示例代码:
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有构造方法
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在这个示例中,构造方法被声明为私有,以防止类的外部实例化。通过 getInstance() 方法获取类的唯一实例。在第一次调用 getInstance() 时,会创建一个新的实例。之后的调用将直接返回已创建的实例。需要注意的是,由于线程安全问题,getInstance() 方法使用了 synchronized 关键字来保证线程安全性。
17、以下是一个简单的示例,手写增删改查的 SQL 语句:
INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)
SELECT column1, column2, ... FROM table_name WHERE condition
UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition
DELETE FROM table_name WHERE condition
其中,table_name 是表名,column1, column2 等是列名,value1, value2 等是对应的值,condition 是查询或删除的条件。
请根据实际情况替换表名、列名、值和条件。
18、Redis 是一种开源的高性能键值对存储数据库,通常被用作缓存、消息队列或临时数据存储等。Redis 支持多种数据结构,如字符串、哈希表、列表、集合和有序集合等,具有快速读写性能、持久化、发布 - 订阅等特性。
Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它支持全文搜索、结构化搜索、分布式搜索、实时搜索等功能。Elasticsearch 主要用于构建实时的应用程序,如日志分析、复杂的搜索应用程序、数据挖掘等。
19、接口测试通常需要发送 HTTP 请求,并验证服务器的响应是否符合预期。常见的做法是使用测试框架,如 JUnit 或 TestNG,并结合某种 HTTP 客户端库,如 Apache HttpClient 或 OkHttp,来进行自动化测试。
如果存在接口依赖关系,可以使用以下几种方法来解决:
串行依赖:按照接口依赖的顺序进行测试,确保前一个接口的结果可以作为后一个接口的输入。
并行依赖:使用多线程或并发测试框架,同时发送多个接口请求,并在所有请求完成后验证结果。
模拟依赖:使用模拟工具或框架,如 Mockito 或 WireMock,来模拟依赖接口的返回结果,以便独立进行测试。
具体的方法取决于具体的测试场景和需求。
20、元组(Tuple)和列表(List)是 Python 中的两种不同的数据类型。
元组是一种不可变序列,它可以包含任意类型的元素,使用小括号 () 表示。元组的元素可以通过索引来访问,但不能修改。例如:
tup = (1, "a", True)
print(tup[0]) # 输出: 1
列表是一种可变序列,它可以包含任意类型的元素,使用方括号 [] 表示。列表的元素可以通过索引来访问和修改。例如:
lst = [1, "a", True]
print(lst[0]) # 输出: 1
lst[0] = 2
print(lst[0]) # 输出
21、在 Python 中,*args
和**kwargs
是用来处理函数传入的可变数量的参数的特殊语法。
*args
可以接收任意数量的位置参数,它将这些参数作为一个元组 (tuple
) 传递给函数。通常用于不确定传入参数个数的情况。示例代码:
def my_function(*args):
for arg in args:
print(arg)
my_function("Hello", "World", 2023)
# 输出: Hello
# World
# 2023
**kwargs
可以接收任意数量的关键字参数,它将这些参数作为一个字典 (dictionary
) 传递给函数。通常用于需要接收可变数量的关键字参数的情况。示例代码:
def my_function(**kwargs):
for key, value in kwargs.items():
print(key, value)
my_function(name="John", age=25, city="New York")
# 输出: name John
# age 25
# city New York
args
和kwargs
只是约定俗成的命名,你也可以使用其他的参数名,但通常建议遵循这两个命名约定。
22、常见的反爬机制有以下几种:
User-Agent 识别:通过检查请求的 User-Agent 头部信息,来判断请求是否来自浏览器。常见的解决方法是在 HTTP 请求的头部中添加一个合法的 User-Agent。
IP 封禁:如果爬虫频繁请求某个 IP 地址,可能被目标网站的防爬系统封禁该 IP。解决方法可以使用代理 IP,轮流切换 IP 地址,以避免封禁。
页面解析限制:网站可能通过 JavaScript、验证码、动态生成的内容等方式来阻止爬虫获取数据。解决方法是模拟浏览器行为,使用工具如 Selenium 来自动化解析 JS 和处理验证码。
请求频率限制:网站可能会限制单位时间内的请求次数,超过限制可能会导致封禁 IP 或返回错误页面。解决方法是使用合理的请求间隔时间,模拟人类操作的频率。
对于动态加载的页面,可以使用以下几种方法进行爬取:
分析 XHR 请求:动态加载的数据通常是通过异步请求 (XHR/AJAX) 获取的。可以通过浏览器开发者工具 (Network 面板) 或者抓包工具查看网页的请求,找到 XHR 请求的 URL 和参数,模拟发送请求来获取数据。
使用动态渲染技术:使用工具如 Selenium 或 Pyppeteer 模拟浏览器行为,完全加载和渲染页面后再提取数据。
解析 JavaScript 代码:有些页面使用 JavaScript 动态生成数据,可以使用 JavaScript 解释器如 PyExecJS 来执行网页中的 JavaScript 代码,并提取所需数据。
需要根据具体情况选择合适的方法来应对反爬机制和动态加载页面。注意在爬取数据时要遵守网站的规则,避免对网站造成不必要的压力和干扰。
# 定义 Person 类
class Person:
def __init__(self, name, gender, age):
self.name = name
self.gender = gender
self.age = age
# 定义 Student 类,继承自 Person 类
class Student(Person):
def __init__(self, name, gender, age, score):
super().__init__(name, gender, age)
self.score = score
# 创建 Student 实例
kathy = Student("Kathy", "Female", 20, 85)
Jim = Student("Jim", "Male", 22, 75)
John = Student("John", "Male", 23, 90)
Alice = Student("Alice", "Female", 21, 82)
Leo = Student("Leo", "Male", 24, 77)
# 将学生实例放入列表
People = [kathy, Jim, John, Alice, Leo]
# 对列表中的学生按分数进行降序排序,并筛选出分数大于 80 的学生
sorted_students = sorted(People, key=lambda x: x.score, reverse=True)
high_score_students = [student for student in sorted_students if student.score > 80]
# 打印结果
for student in high_score_students:
print(f'{student.name}, Score: {student.score}')
Python 中的高阶函数可以接收函数作为参数或返回一个函数。常见的高阶函数包括:
map()
: 接收一个函数和一个序列,将函数应用于序列的每个元素。filter()
: 接收一个函数和一个序列,返回序列中使函数返回值为 True
的元素组成的迭代器。reduce()
: 接收一个函数和一个序列,将函数累积地应用到序列的元素上,返回一个单一的结果。yield
语句的函数,它允许函数在保持当前状态的情况下返回一个值,然后再次从它停止的地方继续执行。__iter__()
和 __next__()
方法的对象,允许对象成为 for
循环的迭代对象。在 Python 中,可以使用 int()
函数将字符串转换为整数,前提是字符串表示的是有效的整数。
s = "123"
num = int(s)
三次握手: 建立一个可靠的连接,防止失效的连接请求突然被服务器接收。
四次挥手: 关闭一个已经建立的 TCP 连接。
200 OK
: 请求成功,这是最常见的成功状态码。201 Created
: 请求成功,并且服务器创建了一个新的资源。400 Bad Request
: 服务器无法理解请求,通常是客户端错误。401 Unauthorized
: 请求未授权,需要验证身份。403 Forbidden
: 服务器理解请求,但是拒绝执行。404 Not Found
: 请求的资源不存在。500 Internal Server Error
: 服务器内部错误,无法完成请求。502 Bad Gateway
: 作为网关或代理工作的服务器从上游服务器接收到无效响应。503 Service Unavailable
: 服务器目前无法使用,可能是过载或维护。WebDriver 是一个自动化测试工具,它提供了一个 API 来模拟用户在浏览器中的操作。WebDriver 通过发送 HTTP 请求到浏览器驱动(如 ChromeDriver 或 GeckoDriver),浏览器驱动控制浏览器的行为。WebDriver 支持多种编程语言,如 Python、Java、C# 等。
Appium 是一个开源的跨平台测试工具,用于自动化原生、移动 Web 和混合应用。它允许开发者使用单一的 API 来编写测试脚本,这些脚本可以在不同的平台上运行,如 iOS、Android 和 Windows。Appium 的核心原理是使用 WebDriver 协议来与移动设备进行通信,模拟用户的操作。
在 Selenium 自动化测试中,有多种方法可以定位页面元素:
id
: 通过元素的 id
属性定位。name
: 通过元素的 name
属性定位。class_name
: 通过元素的 class
属性定位。css_selector
: 通过 CSS 选择器定位。xpath
: 通过 XPath 定位。link_text
: 通过链接的文本定位。partial_link_text
: 通过链接的部分文本定位。冒泡排序和快速排序都是常用的排序算法,但它们的性能和复杂度有所不同。
在 Linux 中,可以使用 tail
命令来查看日志文件的最后几行,使用 -f
选项可以实时查看日志文件的更新。
tail -f /path/to/logfile.log
在 Linux 中,可以使用 ps
命令来查看当前运行的进程。
ps aux
Dockerfile 是一个文本文件,包含了一系列的指令和参数,用于构建 Docker 镜像。一个典型的 Dockerfile 包括以下指令:
FROM
: 指定基础镜像。WORKDIR
: 设置工作目录。COPY
: 将文件从构建上下文复制到镜像中。RUN
: 执行命令并创建新的镜像层。CMD
: 指定容器启动时执行的命令。Python 使用引用计数和标记 - 清除机制进行垃圾回收。引用计数是跟踪每个对象的引用数量,当引用计数为 0 时,对象将被回收。标记 - 清除机制用于处理循环引用的问题,它标记所有可达的对象,并清除未标记的对象。
TestNG 是一个测试框架,用于编写和运行自动化测试。它支持参数化测试、依赖管理和测试分组。
import org.testng.Assert;
import org.testng.annotations.Test;
public class MyTest {
@Test
public void testMethod() {
int expected = 5;
int actual = 2 + 3;
Assert.assertEquals(actual, expected);
}
}
单例模式确保一个类只有一个实例,并提供一个全局访问点。在 Java 中,单例模式可以通过多种方式实现,如懒汉式、饿汉式、双重校验锁等。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
SQL 是用于管理关系数据库的标准编程语言,包括增删改查操作:
-- 增加
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
-- 删除
DELETE FROM table_name WHERE condition;
-- 修改
UPDATE table_name SET column1 = value1 WHERE condition;
-- 查询
SELECT * FROM table_name WHERE condition;
接口测试是测试系统组件间接口的一种方法。它通常使用工具如 Postman 或编写代码(如使用 Python 的 requests
库)来测试 RESTful API。对于接口依赖关系,可以使用 Mock 服务来模拟依赖的接口,或者在测试环境中设置测试数据。
append()
, remove()
, pop()
等。*args
和 **kwargs
*args
: 允许你将不定数量的位置参数传递给函数。这些参数在函数内部作为一个元组处理。**kwargs
: 允许你将不定数量的关键字参数传递给函数。这些参数在函数内部作为一个字典处理。对于动态加载的页面,可以使用 Selenium 或 Puppeteer 等工具模拟浏览器行为,等待 JavaScript 执行完成后再进行数据抓取。这些工具可以模拟点击、滚动等用户行为,获取动态加载后的内容。