9 kļūdas, no kurām jāizvairās, programmējot Java valodā
No kādām kļūdām vajadzētu izvairīties, programmējot Java valodā? Šajā rakstā mēs atbildēsim uz šo jautājumu.
Uzziniet, kā palaist konteineru formas testus ar Java saistītā rakstā, kurā mūsu vecākais Java programmētājs parāda visu burvību.
Es izmantoju Spring Boot in the projekts lai mazinātu uzrakstu skaitu. Testu konteineri ir neatkarīgi no Pavasara ietvars un varat tos izmantot arī bez tā.
Es izmantoju Testcontainers versiju 1.17.3, bet varat izmantot arī jaunāko. Testi ar Postgres konteineru.
Vispirms definējiet konteineru:
public klase Postgres13TC extends PostgreSQLContainer {
private static final Postgres13TC TC = new Postgres13TC();
private Postgres13TC() {
super("postgres:13.2");
}
public static Postgres13TC getInstance() {
return TC;
}
@Override
public void start() {
super.start();
System.setProperty("DB_URL", TC.getJdbcUrl());
System.setProperty("DB_USERNAME", TC.getUsername());
System.setProperty("DB_PASSWORD", TC.getPassword());
}
@Override
public void stop() {
// neko nedara. Šī ir koplietojamā instance. Ļaujiet JVM apstrādāt šo operāciju.
}
}
Pēc tam inicializējiet Pavasara lietojumprogrammas kontekstu. Mēs saņemam visus dati avota konfigurāciju no konteinera gadījuma un iestatiet to kā Pavasara konfigurāciju:
publiskā klase ContainerInit implementē ApplicationContextInitializer {
public static Postgres13TC postgres13TC;
static {
postgres13TC = Postgres13TC.getInstance();
postgres13TC.start();
}
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(
applicationContext,
"spring.datasource.url=" + postgres13TC.getJdbcUrl(),
"spring.datasource.username=" + postgres13TC.getUsername(),
"spring.datasource.password=" + postgres13TC.getPassword(),
"db.host=" + postgres13TC.getHost(),
"db.port=" + postgres13TC.getMappedPort(postgres13TC.POSTGRESQL_PORT),
"db.name=" + postgres13TC.getDatabaseName(),
"db.username=" + postgres13TC.getUsername(),
"db.password=" + postgres13TC.getPassword()
);
}
}
Beidzot mēs varam palaist mūsu testu, un viss tiks palaists zem pārsega:
@SpringBootTest(webEnvironment = RANDOM_PORT)
@AutoConfigureTestDatabase(replace = NONE)
@ContextConfiguration(initializers = ContainerInit.class)
@Testcontainers
class DummyRepositoryTest {
@Autowired
private DummyRepository dummyRepository;
@Test
void shouldReturnDummy() {
var byId = dummyRepository.getById(10L);
var expected = new Dummy();
expected.setId(10L);
assertThat(byId).completes().emitsCount(1).emits(expected);
}
}
Vai arī, ja mēs vēlamies palaist neatkarīgu Spring testu, mēs varam tieši izmantot konteineru:
@Testcontainers
klase SimpleDbTest {
@Container
private static final Postgres13TC postgres13TC = Postgres13TC.getInstance();
@Test
void testConnection() {
assumeThat(postgres13TC.isRunning());
var connectionProps = new Properties();
connectionProps.put("user", postgres13TC.getUsername());
connectionProps.put("password", postgres13TC.getPassword());
try (Connection connection = DriverManager.getConnection(postgres13TC.getJdbcUrl(),
connectionProps)) {
var resultSet = connection.prepareStatement("Select 1").executeQuery();
resultSet.next();
assertThat(resultSet.getInt(1)).isEqualTo(1);
} catch (SQLException sqlException) {
assertThat((Exception) sqlException).doesNotThrowAnyException();
}
}
}
Testkonteineri ir ļoti ērti lietojami rīki, kas palīdz mums lai izveidotu integrācijas testus, kas izmanto Docker konteineri. Tas mums nodrošina lielāku elastību un palielina izstrādes ātrumu. Pareiza testu konfigurācijas iestatīšana samazina laiku, kas nepieciešams, lai uzņemtu jaunus izstrādātājus. Viņiem nav jākonfigurē visas atkarības, vienkārši jāpalaiž uzrakstītie testi ar izvēlētiem konfigurācijas failiem.
