中级面试题
如何处理测试之间的依赖关系
面试题目
- 级别: L3
- 知识模块: pytest/自动化测试
如何处理测试之间的依赖关系?
公司
- 大众外包
招聘类型
社招
题目解析
面试官考察:
- 考察是否理解测试用例独立性的重要性。
- 考察候选人对
pytest
fixture
的熟练程度。 - 考察是否知道如何处理测试执行后的环境恢复问题。
解题思路:
- 最小化依赖:尽量使测试用例独立,避免直接的依赖关系,减少执行用例的一个耦合性。
- 使用Fixture来处理简介依赖的关系。
- 指定执行循序:如果需要按照顺序执行使用
pytest
的@pytest.mark.run
装饰器来定义执行的顺序。 - 清理和恢复:通过fixture可以在测试用例之间共享初始化和清理代码。
- 依赖注入:通过fixture 或参数化的方式将共享数据注入测试用例。
答案
首先设计测试用例时要尽量独立,减少用例的耦合性。
通过 pytest
的 fixture
管理共享数据,按需控制测试执行顺序,并确保环境恢复。
如何模拟测试数据
面试题目
- 级别: L3
- 知识模块: pytest/自动化测试
如何模拟测试数据?
公司
- 大众外包
招聘类型
社招
题目解析
在软件测试中,我们通常需要模拟测试数据来验证不同功能的行为,同时需要处理敏感数据以确保数据隐私和安全。
面试官考察:
- 对模拟测试数据的基本知识和常用方法。
- 是否能熟练使用各种工具和库来生成测试数据。
- 是否能根据不同的需求和场景选择合适的数据模拟。
解题思路:
-
讲出使用什么技术:使用
fixture
+第三方库如Faker
第三方库生成模拟数据。 -
讲述对应的使用语法:
from faker import Faker
import pytest
fake = Faker() # 创建 Faker 实例
@pytest.fixture
def fake_user_data():
# 使用 Faker 生成模拟用户数据
return {
'name': fake.name(),
'email': fake.email(),
'address': fake.address(),
'phone_number': fake.phone_number()
}
答案
可以使用 fixture 来提供测试数据,或者使用第三方库生成模拟数据。
首先要导入对应的包,通过装饰器装饰 fixture 函数,函数中回传调用 faker 库的对应方法生成模拟数据,最后再调用 fixture 的函数,python 就会自动注入到对应的测试用例中。
pytest 在运行过程中如何将测试用例分类?
面试题目
- 级别: L1
- 知识模块:pytest/自动化测试
pytest 在运行过程中如何将测试用例分类?
公司
- 大众外包
招聘类型
社招
题目解析
面试官考察:
- 考察是否理解将测试用例分类的目的和实际应用。
- 考察对
pytest
标记的使用及其如何帮助分类测试用例的理解。 - 考察
Fixture
和Mark
机制的理解以及对pytest
文档的熟悉程度。
解题思路:
pytest 在运行过程中可以通过 Fixture 和 Mark 机制将测试用例进行分类。
-
使用 Mark 标记分类:Mark 是 pytest 中一种注解机制,用于为测试函数打上标记。可以使用 Mark 为测试用例打上不同的标记,如
@pytest.mark.smoke
、@pytest.mark.integration
等,从而将测试用例按照不同的类型或特性进行分类。可以通过 Mark 机制选择性地运行特定类型的测试用例集合。 -
Fixture 分类:Fixture 是 pytest 中用来管理测试环境和资源的工具。通过定义不同的 Fixture,可以将测试用例按照测试环境、资源需求或测试目的进行分类,并在测试函数中引用对应的 Fixture。
-
自定义插件分类:可以编写自定义插件来对测试用例进行分类和管理。通过自定义插件,可以实现更灵活和定制化的测试用例分类方式。
-
pytest 参数过滤:在运行 pytest 时,可以使用
-k
参数来按照关键字过滤测试用例,也可以使用-m
参数按照标记(mark)过滤测试用例。这样可以选择性地运行特定分类的测试用例。
通过 Fixture 和 Mark 机制的灵活组合,pytest 能够实现方便的测试用例分类和管理,使得测试代码更加结构清晰和易于维护。
答案
pytest
在运行过程中可以通过 Fixture 和 Mark 机制对测试用例进行分类。
Fixture 是用于准备测试环境的工具,可以按照不同的环境和资源需求分类测试用例。
而 Mark 是一种注解机制,可以为测试函数打上标记,如@pytest.mark.smoke
、@pytest.mark.integration
等,以便按照不同特性或类型分类测试用例。
通过使用Fixture
和Mark
机制,pytest
能够实现灵活的测试用例分类和管理,使得测试代码更易于理解、维护和运行。
如何跳过或预期失败一个 pytest 用例两者的区别是
面试题目
- 级别: L2
- 知识模块: pytest/自动化测试
如何跳过或预期失败一个pytest用例?两者的区别是?
公司
- 大众外包
招聘类型
社招/校招
题目解析
在pytest
中,有时我们需要跳过某些测试用例或标记它们为预期失败(xfail)。这些功能对于处理临时性的问题、条件性测试和未完成的功能都很有用。
面试官考察:
- 考察对
pytest
装饰器的理解。 - 是否能够在实际测试中正确地应用这些装饰器来处理跳过和预期失败的测试。
- 评估能否根据测试需求选择合适的装饰器来提高测试的有效性和覆盖率。
解题思路:
skip
:跳过被装饰的用例。
@pytest.mark.skip(reason="This test is skipped")
def test_skipped():
assert 1 + 1 == 2
skipif
:根据条件跳过被装饰的测试用例。
@pytest.mark.skipif(sys.version_info < (3, 6), reason="Requires Python 3.6 or higher")
def test_skipif():
assert 1 + 1 == 2
xfail
:预期装饰的测试用例会执行失败。(失败则通过,成功则失败)
@pytest.mark.xfail(reason="This test is expected to fail")
def test_xfail():
assert 1 + 1 == 3
- 再讲出区别。
答案
使用@pytest.mark.skip
装饰器可以标记跳过一个用例;
使用@pytest.mark.skipif
装饰器可以根据条件跳过一个用例;
使用@pytest.mark.xfail
可以标记预期会失败的用例。
区别:
如何在 pytest 中编写一个带有多个断言的测试用例
面试题目
- 级别: L1
- 知识模块: pytest/自动化测试
如何在 pytest 中编写一个带有多个断言的测试用例?
公司
- 大众外包
招聘类型
社招/校招
题目解析
在软件测试过程中,我们经常需要在一个测试用例中验证多个条件。例如,在一个函数的多个返回值或多个变量的状态都需要被检查的情况下,我们可以使用多个断言来实现。
面试官考察:
- 考察对
pytest
断言机制的掌握情况。 - 考察在测试用例中使用多个断言来验证不同条件的能力。
解题思路:
- 讲解多个断言的使用方式:添加多条 assert 语句。
def test_multiple_assertions():
x = 5
y = 10
# 断言1:验证x的值是否为5
assert x == 5, f"Expected x to be 5 but got {x}"
# 断言2:验证y的值是否为10
assert y == 10, f"Expected y to be 10 but got {y}"
# 断言3:验证x + y的值是否为15
assert x + y == 15, f"Expected x + y to be 15 but got {x + y}"
# 断言4:验证x和y的乘积是否为50
assert x * y == 50, f"Expected x * y to be 50 but got {x * y}"
只有当所有断言都通过时,测试用例才会被标记为通过。
答案
在pytest
中,使用多条 assert 语句分别进行断言,当所有断言语句均通过后,测试用才是通过状态。例如:
def test_multiple_assertions():
x = 5
y = 10
# 断言1:验证x的值是否为5
assert x == 5, f"Expected x to be 5 but got {x}"
# 断言2:验证y的值是否为10
assert y == 10, f"Expected y to be 10 but got {y}"
# 断言3:验证x + y的值是否为15
assert x + y == 15, f"Expected x + y to be 15 but got {x + y}"
# 断言4:验证x和y的乘积是否为50
assert x * y == 50, f"Expected x * y to be 50 but got {x * y}"
如何在 pytest 中跳过某个特定条件下的测试用例
面试题目
- 级别: L2
- 知识模块: pytest/自动化测试
如何在 pytest 中跳过某个特定条件下的测试用例?
公司
- 大众外包
招聘类型
社招/校招
题目解析
在软件开发过程中,有时候我们需要根据运行环境的条件(例如 Python 版本)来决定是否执行某些测试用例。
面试官考察:
- 了解对选择 pytest 跳过测试功能的掌握情况
- 评估是否能在不同场景下灵活运用 pytest 的选择跳过测试功能来解决实际的问题。
解题思路:
-
明确使用的方法:
@pytest.mark.skipif
装饰器 -
讲出具体的 skipif 如何使用
@pytest.mark.skipif(跳过的条件,reason=“跳过的理由,显示在测试报告中”)
答案
在pytest
中,可以使用@pytest.mark.skipif
装饰器来根据条件跳过测试用例。例如:
import pytest
import sys
# 当python版本低于3.6时,则跳过该测试用例
@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires Python 3.6 or higher")
def test_example():
assert 1 + 1 == 2
如何在 pytest 中为不同的测试用例运行不同的设置代码
面试题目
- 级别: L3
- 知识模块: pytest/自动化测试
如何在pytest中为不同的测试用例运行不同的设置代码?
公司
- 大众外包
招聘类型
社招
题目解析
在软件测试过程中,有时候需要为测试用例设置初始化和清理代码,例如初始化数据库连接、创建临时文件等。
面试官考察:
- 了解对pytest fixtures的基本概念和使用方法的掌握情况。
- 评估能否在复杂测试场景下灵活运用fixtures来解决实际问题。
解题思路:
- 讲出使用方法:fixtures
- 概要介绍如何实现:使用
@pytest.fixture
装饰器。
答案
在pytest
中,可以使用@pytest.fixture
装饰器来定义一个设置函数,然后在需要使用该设置的测试用例中将其作为参数传入。例如:
import pytest
# 定义fixture,通过scope指定作用域为模块级
@pytest.fixture(scope="module")
def setup_module():
print("模块初始化")
# yield语句将控制权交回给pytest,并允许测试用例运行。
yield
# yield之后的代码将在所有测试用例执行完毕后运行。
print("清理模块级别")
# 定义函数,setup_module为接收参数,自动被pytest注入
def test_example(setup_module):
print("运行测试函数")
如何在 pytest 中为测试用例设置超时时间
面试题目
- 级别: L2
- 知识模块: pytest/自动化测试
如何在 pytest 中为测试用例设置超时时间?
公司
- 大众外包
招聘类型
社招
题目解析
在软件测试过程中,有时候测试用例可能会由于各种原因运行时间过长,影响整体测试效率。为此,我们需要为测试用例设置超时时间。
面试官考察:
- 考察对设置超时时间的方法和应用场景的熟悉程度
- 考察对
pytest-timeout
插件的掌握情况。
解题思路:
@pytest.mark.timeout
:为单个测试用例设置时间
import pytest
# 测试用例 `test_example` 将在5秒后被强制终止并标记为失败。
@pytest.mark.timeout(5)
def test_example():
import time
time.sleep(10)
assert True
- 为所有用例设置时间
# 为所有测试用例设置一个5秒的超时时间。
pytest --timeout=5
答案
在pytest
中,可以使用pytest-timeout
插件来为测试用例设置超时时间。
首先需要安装该插件:
pip install pytest-timeout
然后在测试用例中使用@pytest.mark.timeout 装饰器在对应的测试用例上来设置超时时间,例如:
import pytest
# 测试用例 `test_example` 将在5秒后被强制终止并标记为失败。
@pytest.mark.timeout(5)
def test_example():
import time
time.sleep(10)
assert True
其次,可以在运行pytest
时通过命令行参数设置全局超时时间。
pytest --timeout=5
在 pytest 中如何执行模块级别的测试用例
面试题目
- 级别: L3
- 知识模块: pytest/自动化测试
在pytest中如何执行模块级别的测试用例?
公司
- 大众外包
招聘类型
社招
题目解析
在软件测试过程中,我们经常需要在模块级别执行测试用例,以确保整个模块的功能和依赖关系得到正确验证。
面试官考察:
- 对
pytest
基础功能和命令的掌握情况。 - 能够正确使用
pytest
的命令行参数和fixture来控制测试的执行。
解题思路:
- 使用模块级别的fixture:通过定义模块级别的fixture,可以确保在模块级别执行初始化和清理代码,并在模块内的所有测试用例运行之前和之后执行这些代码。
@pytest.fixture(scope="module")
通过fixture装饰器中的scope设置测试用例级别。
import pytest
@pytest.fixture(scope="module")
def setup_module():
print("Setting up the module")
yield
print("Tearing down the module")
def test_example1(setup_module):
print("Running test_example1")
assert True
def test_example2(setup_module):
print("Running test_example2")
assert True
- 使用命令行参数:指定要运行的测试模块。
# 运行指定模块的测试用例
pytest test_example.py
# 指定测试文件中的测试函数
pytest test_example.py::test_case1
- 组织测试用例文件:将测试用例文件放在特定目录中,并在
pytest
命令中指定该目录。
pytest tests/
答案
首先可以定义模块级别的fixture来确保在模块级别执行初始化和清理代码。
使用@pytest.fixture(scope="module")
在对应的测试用例前进行装饰。
其次可以使用命令参数来指定要运行的测试用例或函数。
通过pytest 文件名::测试用例名
。
最后可以创建一个测试文件目录,组织测试用例文件,进行统一执行。
通过pytest 文件名/
的方式完成整个目录下所有测试用例的执行。
pytest 数据驱动怎么做
面试题目
- 级别: L3
- 知识模块: pytest/自动化测试
pytest
数据驱动怎么做
公司
- 字节外包
招聘类型
社招
题目解析
面试官考察:
- 数据驱动的理解程度。
pytest
数据驱动的实现方法。
解题思路:
-
数据驱动定义:数据驱动是一种测试技术,它可以将测试用例与测试数据分离,使测试用例具有更高的可复用性和可维护性。数据驱动的基本思想是将测试用例与测试数据分离,通过参数化的方式运行测试用例,从而减少代码冗余,提高测试效率。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议大家使用一种结构化的文件(例如
yaml
,json
, 等)来对数据进行存储,然后在测试用例中读取这些数据。 -
Pytest
数据驱动就是通过参数化的方式运行测试用例。Pytest
提供了两种数据驱动的方式:- 使用
@pytest.mark.parametrize()
:通过此装饰器为测试函数提供多组输入数据和期望输出,例如@pytest.mark.parametrize("input, expected", [(1, 2), (2, 4)])
,从而以数据驱动的方式运行测试。
- 使用
import pytest
from math import sqrt
@pytest.mark.parametrize("x", [0, 1, 2, 3])
def test_sqrt(x):
assert sqrt(x) == x**0.5
1. 使用`pytest.fixture`结合`params`:定义fixture时,利用`params`参数传入多组数据,然后在测试函数中通过fixture获取数据,实现数据驱动。
import pytest
# 定义Fixture
@pytest.fixture(params=[
(1, 2),
(2, 4),
(3, 6),
(4, 8)
])
def input_output(request):
return request.param
# 测试函数
def test_multiplication(input_output):
input_value, expected_result = input_output
result = input_value * 2
assert result == expected_result
答案
pytest
完成数据驱动有两种方式使用@pytest.mark.parametrize()
或pytest.fixture
结合params
来实现数据驱动。
pytest 跳过操作
面试题目
- 级别: L1
- 知识模块:pytest/自动化测试
pytest
跳过操作:@pytest.mark.skip
公司
- 字节外包
招聘类型
社招
题目解析
面试官考察:
- 考察是否理解跳过测试用例的目的和实际应用场景。
- 考察对
pytest
中跳过测试用例的不同方法的熟悉程度。
解题思路:
-
本题考察对
pytest
装饰器的了解。使用@pytest.mark.skip
装饰器可以标记测试用例为跳过状态,不执行该用例。
import pytest
@pytest.mark.skip("This test is failing")
def test_example():
assert 1 + 1 == 3
答案
在pytest
中,可以使用@pytest.mark.skip
装饰器来跳过某个测试函数或类。当测试函数或类被标记为跳过状态时,pytest
将不执行这些测试。跳过测试通常用于临时禁用测试用例或在某些条件下不执行测试,可以帮助测试人员快速跳过特定用例,提高测试效率和灵活性。例如,可以在某些平台或特定条件下跳过测试。
pytest 在参数化的应用场景是什么
面试题目
- 级别: L1
- 知识模块: pytest/自动化测试
pytest 在参数化的应用场景是什么?
公司
- 大众外包
招聘类型
社招
题目解析
面试官考察:
- 考察是否理解参数化的基本概念及其用途。
- 考察是否能识别和描述适合参数化的场景。
- 考察候选人对
pytest
中实现参数化的不同方法的熟悉程度.
解题思路:
pytest
中的参数化功能允许测试用例使用多组参数运行,从而更全面地覆盖不同情况下的测试。参数化的应用场景包括:
-
减少重复代码:通过参数化可以避免编写多份相似的测试用例代码,只需针对不同参数组合写一个测试函数即可。
-
增加测试覆盖率:可以轻松地测试不同参数组合下的不同情况,提高测试覆盖率。
-
数据驱动测试:通过参数化可以实现数据驱动测试,将测试数据与测试逻辑分离,方便管理和维护。
-
快速定位问题:当测试用例失败时,参数化可以快速帮助定位哪组参数导致失败,有助于快速排查问题。
-
灵活性:参数化可以让测试用例更具灵活性,轻松应对不同场景下的测试需求。
总之,参数化能够简化测试用例编写、增加测试覆盖范围、提高测试效率,是pytest
中非常实用的功能。
答案
pytest 中的参数化功能适用于多种场景。
首先,它可以减少代码重复,通过一次性编写测试函数并指定不同参数组合,避免重复编写多份相似测试用例代码。
其次,参数化可以提高测试用例的覆盖率,测试不同参数组合下的各种情况。
此外,参数化实现数据驱动测试,将测试数据与测试逻辑分离,方便管理和维护。
对于快速问题定位,当测试用例失败时,参数化可快速帮助定位造成失败的参数组合。
最后,参数化使测试用例更具灵活性,能够轻松应对不同场景下的测试需求,提高测试效率和可维护性。
pytest 在运行过程中如何将测试用例分类?
面试题目
- 级别: L1
- 知识模块:pytest/自动化测试
pytest 在运行过程中如何将测试用例分类?
公司
- 大众外包
招聘类型
社招
题目解析
面试官考察:
- 考察是否理解将测试用例分类的目的和实际应用。
- 考察对
pytest
标记的使用及其如何帮助分类测试用例的理解。 - 考察
Fixture
和Mark
机制的理解以及对pytest
文档的熟悉程度。
解题思路:
pytest 在运行过程中可以通过 Fixture 和 Mark 机制将测试用例进行分类。
-
使用 Mark 标记分类:Mark 是 pytest 中一种注解机制,用于为测试函数打上标记。可以使用 Mark 为测试用例打上不同的标记,如
@pytest.mark.smoke
、@pytest.mark.integration
等,从而将测试用例按照不同的类型或特性进行分类。可以通过 Mark 机制选择性地运行特定类型的测试用例集合。 -
Fixture 分类:Fixture 是 pytest 中用来管理测试环境和资源的工具。通过定义不同的 Fixture,可以将测试用例按照测试环境、资源需求或测试目的进行分类,并在测试函数中引用对应的 Fixture。
-
自定义插件分类:可以编写自定义插件来对测试用例进行分类和管理。通过自定义插件,可以实现更灵活和定制化的测试用例分类方式。
-
pytest 参数过滤:在运行 pytest 时,可以使用
-k
参数来按照关键字过滤测试用例,也可以使用-m
参数按照标记(mark)过滤测试用例。这样可以选择性地运行特定分类的测试用例。
通过 Fixture 和 Mark 机制的灵活组合,pytest 能够实现方便的测试用例分类和管理,使得测试代码更加结构清晰和易于维护。
答案
pytest
在运行过程中可以通过 Fixture 和 Mark 机制对测试用例进行分类。
Fixture 是用于准备测试环境的工具,可以按照不同的环境和资源需求分类测试用例。
而 Mark 是一种注解机制,可以为测试函数打上标记,如@pytest.mark.smoke
、@pytest.mark.integration
等,以便按照不同特性或类型分类测试用例。
通过使用Fixture
和Mark
机制,pytest
能够实现灵活的测试用例分类和管理,使得测试代码更易于理解、维护和运行。
pytest 中如何进行异常测试
面试题目
- 级别: L2
- 知识模块: pytest/自动化测试
pytest 中如何进行异常测试?
公司
- 大众外包
招聘类型
社招
题目解析
面试官考察:
- pytest 异常处理和一异常测试的掌握情况
- 评估能够在不同的场景下灵活的运用 pytest 的异常测试功能来验证代码的正确性
解题思路:
-
明确需要测试的异常类型和场景(例如零除异常、文件不存在异常等)
-
根据不同的异常场景选择使用
pytest.raises()
函数处理异常 -
pytest.raises()函数:pytest.raisess()是一个上下文管理器,允许你在其中编写一个测试块,并指定应该引发的异常类型,可以捕获指定的异常。
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
答案
面试官你好,首先我要分析需要处理的测试异常属于什么样的场景或类型。
在我确定后类型后,选择使用pytest.raises()
函数对异常进行处理。
pytest.raises()函数允许你在其中编写一个测试块,并指定应该引发的异常类型。例如:
import pytest
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
使用 pytest.raises()函数来测试 1 / 0 是否会引发 ZeroDivisionError 异常。