Flaky тест с использованием встроенной базы данных Mysql - PullRequest
0 голосов
/ 28 апреля 2019

Я написал интеграционный тест, в котором используется встроенная база данных Mysql. Когда я выполняю тестовый класс в моей IDE, тесты успешно выполняются вместе с другими интеграционными тестами, которые появляются в том же классе. Проблема возникает, когда я запускаю все тесты вместе, используя Gradle через командную строку.

Ошибка, которую я получаю при запуске через командную строку, выглядит примерно так:

EmployeeRepositoryFindByEmployeeIdTest > shouldReturnDeparmentForEmployeeId() FAILED
    java.lang.AssertionError:
    Expecting:
      <[Employee(ud=118 age=23,department=null),
        Employee(id=219, age=24, department=Deparment(id=5, name=IT))]>
    to contain exactly (and in same order):
      <[Employee(ud=118 age=23,department=Deparment(id=4, name=IT)),
        Employee(id=219, age=24, department=Deparment(id=5, name=IT))]>
    but some elements were not found:
      <[Employee(ud=118 age=23,department=Deparment(id=4, name=IT))]>
    and others were not expected:
      <[Employee(ud=118 age=23,department=null)]>
        EmployeeRepositoryFindByEmployeeIdTest.shouldReturnDeparmentForEmployeeId(EmployeeRepositoryFindByEmployeeIdTest.java:188)

Тест вызывает следующий метод:

@Repository
public class EmployeeRepository {    
  private final DSLContext dsl;

  public EmployeeRepository(DSLContext dsl, Clock clock) {
    this.dsl = dsl;
  }

  // ...

  public List<Employee> getEmployeeByDepartmentId(int departmentId) {
    return dsl.select(
        EMPLOYEE.ID,
        EMPLOYEE.AGE,
        EMPLOYEE.DEPARMENT_ID,
        DEPARTMENT.ID,
        DEPARTMENT.NAME
    ).from(EMPLOYEE)
        .leftJoin(DEPARMENT).on(DEPARMENT.ID.eq(EMPLOYEE.DEPARMENT_ID))
        .where(DEPARMENT.ID.eq(departmentId))
        .orderBy(EMPLOYEE.ID)
        .fetch()
        .map(this::getEmployee);
  }
}

После вызова метода теста ожидается получение двух сотрудников и связанного с ним отдела, но я всегда получаю null для department_id=4. Мне кажется, что соединение не выполняется правильно для некоторых строк в таблице.

Я попытался это исправить, чтобы увеличить wait_timeout и max_connections в конфигурации MySQL до чего-то очень высокого, но я все еще вижу ту же проблему. Кроме того, я обновил до последней версии БД - Version.v5_7_latest - но все тот же. Я не уверен, где еще посмотреть, чтобы это исправить. Есть идеи, как двигаться дальше?

Если это поможет, вот конфигурация MySQL в настройках теста:

  @Bean
  public EmbeddedMysql embeddedMySql() {
    if (embeddedMysql != null) {
      embeddedMysql.reloadSchema("deparment", Collections.emptyList());
      return embeddedMysql;
    } else {
      MysqldConfig config = aMysqldConfig(Version.v5_6_36)
          .withCharset(Charset.UTF8)
          .withPort(3322)
          .withUser("department", "*******")
          .withServerVariable("wait_timeout", "60")
          .withServerVariable("max_connections", "500")
          .build();
      embeddedMysql = anEmbeddedMysql(config)
          .addSchema("department")
          .start();
      return embeddedMysql;
    }
  }

Заранее спасибо за помощь!

...