如何在Gradle中将契约验证结果发布给契约经纪人?

问题描述

我有一个使用gradle(如果需要的话,位于底部的gradle文件)和junit5的Spring Boot构建的服务。关于stackoverflow的许多问题是针对maven和Junit4的,我很难翻译答案。我的契约生产者测试在经纪人的合同上运行并正确测试。但是,成功验证的结果不会发送到代理。 该怎么办?

该协定来自“其他服务”,并确认“我的服务”正确归还了三只可爱的猫。测试结果如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    auto *top1 = createItem("Images","/home/ui/qrc/laserscan.png");
    auto *top2 = createItem("Path","/home/ui/qrc/laserscan.png");
    
    top1->addChild(createItem("Original","/home/ui/qrc/laserscan.png"));
    top1->addChild(createItem("Sample","/home/ui/qrc/laserscan.png"));
    
    top2->addChild(createItem("Left Side","/home/ui/qrc/laserscan.png"));
    top2->addChild(createItem("Right Side","/home/ui/qrc/laserscan.png"));
    
    ui->treeWidget->addTopLevelItems({ top1,top2 });
    ui->treeWidget->addTopLevelItems({ top1,top2 });

    const int n_tops = ui->treeWidget->topLevelItemCount();

    // Below I am assigning to each parent/children a checkBox
    for(int a = 0; a<n_tops; ++a) {
        const int n_children = ui->treeWidget->topLevelItem(a)->childCount();
        qtreewidgetitem_assign_qcheckBox(ui->treeWidget,ui->treeWidget->topLevelItem(a));
        for(int b = 0; b<n_children; ++b) {
            qtreewidgetitem_assign_qcheckBox(ui->treeWidget,ui->treeWidget->topLevelItem(a)->child(b));
        }
    }

    QTreeWidgetItem *parentItem = Q_NULLPTR;
    QTreeWidgetItem *childItem = Q_NULLPTR;

    QMapIterator<QString,QStringList> i(treeMap);
    while (i.hasNext()) {
        i.next();
        parentItem = new QTreeWidgetItem(widget);
        parentItem->setText(0,i.key());
        foreach (const auto &str,i.value()) {
            childItem = new QTreeWidgetItem;
            childItem->setText(0,str);
            parentItem->addChild(childItem);
        }
    }
}

运行QTreeWidget时一切正常。测试通过,并且如果我将状态更改为只有2只猫,则测试将失败,因为该协定要求服务方退回3只猫。但是,契约经纪人未显示成功的验证。我该怎么办?


我已经尝试过,但似乎是错误的:

运行package com.miau.package; // imports @Provider("my_service") @Consumer("other_service") @Pactbroker(authentication = @PactbrokerAuth(username = "pact",password = "${pactPassword}"),//NOSONAR hardcoded password hint no password,just variable host = "pact-broker.apps.home.io/",port = "443",tags = "sandBox" ) @SpringBoottest(classes = Application.class,properties = { "spring.profiles.active=pact,fake-oauth2","pact.verifier.publishResults=true" },webEnvironment = SpringBoottest.WebEnvironment.RANDOM_PORT) @Tag("pact") @ExtendWith({SpringExtension.class}) public class OtherServiceContractVerifier { @LocalServerPort int port; @Autowired Application application; @BeforeEach void before(PactVerificationContext context) { HttpTestTarget target = new HttpTestTarget("localhost",port,"/my_service"); context.setTarget(target); } @TestTemplate @ExtendWith(PactVerificationInvocationContextProvider.class) void executePact(PactVerificationContext context) { context.verifyInteraction(); } @State("3 cute cats exist") public void stateThreecuteCatsExists() { // make 3 cute cats exist in database } } ->“未配置服务提供商”。 不确定他需要服务提供商做什么,因为测试会提供所有必要的信息。但是在进行了一些糊涂之后,我出现了这个问题并将其添加到我的build.gradle中:

./gradlew pactTest pactPublish

不确定他为什么需要该信息,所有这些都已存在于Pact测试中。但至少它更改了./gradlew pactVerify输出,现在它列出了合同并尝试验证它仅因Pact { broker { pactbrokerUrl = "https://pact-broker.apps.home.io/" pactbrokerUsername = "pact" pactbrokerPassword = pactPassword } serviceProviders { 'my_service' { fromPactbroker { selectors = latestTags('SandBox') } } } } 而失败,这似乎是错误方法,因为它不使用现有的Test所有。使用现有的./gradlew pactVerify测试,我还不知道该怎么说。


与gradle文件相关的内容(我将答案从this question合并为无效):

Connect to localhost:8080 [localhost/127.0.0.1,localhost/0:0:0:0:0:0:0:1] Failed: Connection refused (Connection refused)

解决方法

您似乎正在将Gradle验证过程(./gradlew pactVerify)与JUnit 1(例如OtherServiceContractVerifier)混合使用。

两者都可以通过

进行配置

有关gradle的信息,请参见https://docs.pact.io/implementation_guides/jvm/provider/gradle/#project-properties

对于JUnit,请参见https://docs.pact.io/implementation_guides/jvm/provider/junit/#publishing-verification-results-to-a-pact-broker

因此,设置以下内容将启用该功能(注意:您只能从CI发布)

System.setProperty("pact.verifier.publishResults","true");

使用JUnit的示例项目:https://github.com/pactflow/example-provider-springboot