pytest通过配置文件运行标记

时间:2018-08-22 15:03:27

标签: python pytest

我正在使用pytest进行一些功能测试以进行命令行测试。 我将测试保存在yml文件中,该文件用于测试配置。 我想在yml文件中提供一些标记,供pytest使用,而不是在测试文件中使用装饰器方法。

例如

---
test_name: xyz
test_type: smoke
command: hello --help
expected: hello world
assertions:
  - testResult.actual_command_returnCode == 0
  - len(testResult.expected_value_result) != 0
  - testResult.expected_value_result[0] == testResult.actual_command_output

有没有一种方法可以在yml文件中指定标记,而pytest可以使用相同的标记来了解它需要运行哪些特定测试?

2 个答案:

答案 0 :(得分:0)

py.test不读取yaml文件,您将必须编写自己的代码来执行此操作,并将代码添加到测试函数中。您可以使用放置在conftest.py文件中的挂钩函数来做到这一点。这是一个将标记smoke放置在名为test_a的测试上的示例:

def pytest_collection_modifyitems(session, config, items):
    for i in items:
        if i.name == "test_a":
            i.add_marker("smoke")

此函数(如果在conftest.py中存在)在从您的目录中收集测试列表之后以及实际运行任何测试之前,会由py.test自动调用一次。您可以根据需要修改列表items

(注意,我的示例仅查看测试名称,因此它将与任何测试文件中的名为test_a的函数匹配;您可能需要以其他方式选择要应用标记的实际测试,例如,比较i.nodeid的值,该值是类似path/file.py::function_name的字符串。)

这只是一个示例,您应该使用可读取yaml文件的代码替换代码,并根据文件中的内容来决定将哪些标记添加到哪些测试中。

答案 1 :(得分:0)

我在conftest.py文件中创建了一个钩子,如下所示

public class ScreenController {

private Participant participant;

@FXML
public ImageView profileIcon;
@FXML
public Label summonerName;
@FXML
public Label level;
@FXML
public ImageView champIcon;
@FXML
public Label masteryPoints;
@FXML
public Label masteryLevel;
@FXML
public Button goBack;

public void initialize() throws IOException, URISyntaxException {
    participant = MainController.participant;


    System.out.println(participant.getSummonerName());
    Summoner summoner = SummonerUtils.getSummoner(participant.getSummonerName(), Region.TR);
    Champion champion = ChampionUtils.getChampion((int) participant.getChampionId());
    Mastery mastery = MasteryUtils.getMastery(summoner.getSummId(), champion.getId(), Region.TR);

    Image profileImage = new Image(new File(summoner.getProfileIconId()).toURI().toString());
    Image champImage = new Image(new File(champion.getIcon()).toURI().toString());
    profileIcon.setImage(profileImage);
    summonerName.setText(summoner.getSummName());
    level.setText(String.valueOf(summoner.getLevel()) + " Level");
    champIcon.setImage(champImage);
    masteryPoints.setText(String.valueOf(mastery.getChampPoints()) + " Points");
    masteryLevel.setText(String .valueOf(mastery.getChampLevel()) + " Level");

    goBack.setOnMouseClicked((event -> {
        try {
            LolAppApplication.mainStage.getScene().setRoot(FXMLLoader.load(getClass().getClassLoader().getResource("main.fxml")));
            new Thread(MainController.downloadTask).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }));
}

我在执行pytest_runtest_call(i)时遇到属性错误     def pytest_collection_modifyitems(config,items): with open("C:\Users\xyz\mno\cli_automation\test_configuration\project\test_command.yml", 'r') as stream: data_loaded = yaml.load(stream) for i in items: if i.name == data_loaded.get("test_name"): i.add_marker(data_loaded.get("test_type")) pytest_runtest_call(i) 。签入了[https://docs.pytest.org/en/2.8.7/_modules/_pytest/skipping.html]的源代码,它在AttributeError: 'Function' object has no attribute '_evalxfail'的第102行失败了