小编Ken*_*chi的帖子

Python - 使单元测试独立于具有类变量的类

我有一个带有字典的类,用于缓存来自服务器的特定输入响应.由于这用于缓存目的,因此将其保存为类变量.

class MyClass:
    cache_dict = {}

    def get_info_server(self, arg):
        if arg not in self.cache_dict:
            self.cache_dict[arg] = Client.get_from_server(arg)
        return cache_dict[arg]

    def do_something(self, arg):
        # Do something based on get_info_server(arg)
Run Code Online (Sandbox Code Playgroud)

在编写单元测试时,由于字典是一个类变量,因此值跨越测试用例进行缓存.

测试用例

# Assume that Client is mocked.

def test_caching():
    m = MyClass()
    m.get_info_server('foo')
    m.get_info_server('foo')
    mock_client.get_from_server.assert_called_with_once('foo')

def test_do_something():
    m = MyClass()
    mock_client.get_from_server.return_value = 'bar'
    m.do_something('foo') # This internally calls get_info_server('foo')
Run Code Online (Sandbox Code Playgroud)

如果test_caching先执行,则缓存的值将是一些模拟对象.如果test_do_something先执行,那么测试用例只被调用一次的断言将失败.

除了直接操作字典之外,我如何使测试彼此独立(因为这需要深入了解代码的内部工作.如果内部工作稍后要改变,那么我需要验证的是API.本身,而不是依靠内部工作)?

python unit-testing python-unittest

5
推荐指数
1
解决办法
947
查看次数

错误:Analytics Reporting API V4尚未在项目中使用

我正在尝试从JAVA代码访问我的Google Analytics数据.但是当运行以下代码时

package com.test.googleapi;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.analyticsreporting.v4.AnalyticsReporting;
import com.google.api.services.analyticsreporting.v4.model.DateRange;
import com.google.api.services.analyticsreporting.v4.model.Dimension;
import com.google.api.services.analyticsreporting.v4.model.GetReportsRequest;
import com.google.api.services.analyticsreporting.v4.model.GetReportsResponse;
import com.google.api.services.analyticsreporting.v4.model.Metric;
import com.google.api.services.analyticsreporting.v4.model.ReportRequest;

public class AnalyticsApiTest {
    public static void main(String[] args) throws Exception {
        GoogleCredential credential = GoogleCredential
                .fromStream(new FileInputStream(new File("assets/client-secrets/service-account-key.json")))
                .createScoped(Collections.singleton("https://www.googleapis.com/auth/analytics.readonly"));
        HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
        JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
        AnalyticsReporting analyticsReporting = new AnalyticsReporting.Builder(httpTransport, jsonFactory, credential)
                .setApplicationName("Test")
                .build();

        DateRange dateRange = new DateRange(); …
Run Code Online (Sandbox Code Playgroud)

google-analytics google-analytics-api

3
推荐指数
1
解决办法
2844
查看次数

如何在 JUnit 5 测试中使用 WireMock 的响应模板

我正在尝试使用WireMock的响应模板功能,但它似乎不适用于文档中提供的示例代码。

这是一段示例代码:


import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options;

import com.github.tomakehurst.wiremock.WireMockServer;
import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer;
import com.github.tomakehurst.wiremock.junit.WireMockRule;
import io.restassured.RestAssured;
import org.hamcrest.Matchers;
import org.junit.Rule;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

public class WireMockTest {

  @Rule
  public WireMockRule wm = new WireMockRule(options()
      .extensions(new ResponseTemplateTransformer(true)));
  private WireMockServer wireMockServer;

  @BeforeEach
  public void setup() {
    this.wireMockServer = new WireMockServer(
        options().port(8081));
    this.wireMockServer.stubFor(get(urlEqualTo("/test-url"))
        .willReturn(aResponse()
            .withBody("{{request.url}}")
            .withTransformers("response-template")));
    this.wireMockServer.start();
  }

  @Test
  public void test() {
    RestAssured.when()
        .get("http://localhost:8081/test-url")
        .then()
        .log().ifError()
        .body(Matchers.equalTo("/test-url"));
  }

  @AfterEach
  public void …
Run Code Online (Sandbox Code Playgroud)

java wiremock

3
推荐指数
3
解决办法
6745
查看次数