JavaRush /Java Blog /Random-TK /MySql-iň ornuny tutmak üçin MariaDB ulanyp maglumat bazas...

MySql-iň ornuny tutmak üçin MariaDB ulanyp maglumat bazasynyň integrasiýa synagy

Toparda çap edildi
MySql - 1-i çalyşmak üçin MariaDB ulanyp maglumat bazasynyň integrasiýa synagyBu gün synag barada gürleşmek isleýärin, sebäbi kod synaglar bilen näçe köp gurşalsa, şonça-da gowy we ygtybarly hasaplanýar. Bölüm synagy hakda däl-de, maglumat bazalarynyň integrasiýa synagy barada gürleşeliň. Bölüm synaglary bilen integrasiýa synaglarynyň arasynda takyk tapawut näme? MySql - 2 çalyşmak üçin MariaDB ulanyp maglumat bazasynyň integrasiýa synagyModul (birlik) aýratyn modullar, usullar ýa-da synplar derejesinde bir programmany synagdan geçirýär, ýagny synaglar çalt we aňsat bolup, işlemegiň iň bölünýän böleklerine täsir edýär. Olara “her usul üçin bir synag” diýilýär. Integrasiýa has haýal we has agyr bolup, birnäçe moduldan we goşmaça funksiýadan ybarat bolup biler. MySql - 3-i çalyşmak üçin MariaDB ulanyp maglumat bazasynyň integrasiýa synagyNäme üçin dao (Data Access Object) gatlagynyň integrasiýa synaglary? Maglumatlar bazasyna talaplar bilen usullary barlamak üçin, esasy birini çalşyp, RAM-da aýratyn maglumat bazasyny döretmeli. Bu pikir, zerur tablisalary döredýäris, synag maglumatlary bilen doldurýarys we ammar synp usullarynyň dogrulygyny barlaýarys (ahyrsoňy, belli bir ýagdaýda ahyrky netijäniň nähili bolmalydygyny bilýäris). Geliň, başlalyň. Maglumatlar bazasyny birikdirmek baradaky mowzuklar uzak wagtdan bäri dowam edip gelýär, şonuň üçin bu gün bu barada durup geçmek islemeýärin we programmanyň diňe bizi gyzyklandyrýan bölümlerine serederis. Düzgüne görä, programmamyzyň Bahar Boot-a, Bahar JDBC dao gatlagyna (has düşnükli bolmagy üçin) esasy maglumat bazamyz MySQL bolup başlarys we MariDB ulanyp çalşarys (olar iň ýokary derejede gabat gelýär we şoňa laýyklykda MySQL skriptleri hiç haçan MariaDB şiwesinde gapma-garşylyk bolmaz, H2 bilen bolşy ýaly). Şeýle hem, programmamyz maglumatlar bazasynyň shemasyna üýtgeşmeleri dolandyrmak we ulanmak üçin “Liquibase” -ni ulanýar we şoňa laýyklykda ähli ulanylýan skriptler programmamyzda saklanýar.

Taslamanyň gurluşy

Diňe täsir eden bölekler görkezilýär: MySql - 5 çalyşmak üçin MariaDB ulanyp maglumat bazasynyň integrasiýa synagyHawa, bu gün robotlar dörederis)) MySql - 6 çalyşmak üçin MariaDB ulanyp maglumat bazasynyň integrasiýa synagyTablisa üçin skript, şu gün synag etjek usullarymyz (create_table_robots.sql):
CREATE TABLE `robots`
(
   `id`   BIGINT(20) NOT NULL AUTO_INCREMENT,
   `name` CHAR(255) CHARACTER SET utf8 NOT NULL,
   `cpu`  CHAR(255) CHARACTER SET utf8 NOT NULL,
   `producer`  CHAR(255) CHARACTER SET utf8 NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE = InnoDB
 DEFAULT CHARSET = utf8;
Bu tablisany görkezýän gurama:
@Builder
@Data
public class Robot {

   private Long id;

   private String name;

   private String cpu;

   private String producer;
}
Synag ammary üçin interfeýs:
public interface RobotDAO {

   Robot findById(Long id);

   Robot create(Robot robot);

   List<Robot> findAll();

   Robot update(Robot robot);

   void delete(Long id);
}
Aslynda, bu ýerde ekzotikasyz adaty CRUD amallary bar, şonuň üçin ähli usullaryň (gowy, bu hiç kimi geň galdyrmaz) däl-de, käbirleriniň has gysga bolmagy üçin durmuşa geçirilişine serederis:
@Repository
@AllArgsConstructor
public class RobotDAOImpl implements RobotDAO {

   private static final String FIND_BY_ID = "SELECT id, name, cpu, producer FROM robots WHERE id = ?";

   private static final String UPDATE_BY_ID = "UPDATE robots SET name = ?, cpu = ?, producer = ?  WHERE id = ?";

   @Autowired
   private final JdbcTemplate jdbcTemplate;

   @Override
   public Robot findById(Long id) {
       return jdbcTemplate.queryForObject(FIND_BY_ID, robotMapper(), id);
   }

   @Override
   public Robot update(Robot robot) {
       jdbcTemplate.update(UPDATE_BY_ID,
               robot.getName(),
               robot.getCpu(),
               robot.getProducer(),
               robot.getId());

       return robot;
   }

   private RowMapper<Robot> robotMapper() {
       return (rs, rowNum) ->
               Robot.builder()
                       .id(rs.getLong("id"))
                       .name(rs.getString("name"))
                       .cpu(rs.getString("cpu"))
                       .producer(rs.getString("producer"))
                       .build();
   }
Geliň, azajyk göz aýlalyň we garaşlylyklarymyzda nämeleriň bolup geçýändigini göreliň (diňe programmanyň görkezilen bölegi üçin ulanylýanlar görkezilýär):
<dependencies>
   <dependency>
       <groupId>org.mariadb.jdbc</groupId>
       <artifactId>mariadb-java-client</artifactId>
       <version>2.5.2</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>org.craftercms.mariaDB4j</groupId>
       <artifactId>mariaDB4j-springboot</artifactId>
       <version>2.4.2.3</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <version>1.18.10</version>
       <scope>provided</scope>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <version>2.2.1.RELEASE</version>
       <scope>test</scope>
   </dependency>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-jdbc</artifactId>
       <version>2.2.1.RELEASE</version>
   </dependency>
</dependencies>
4 - “MariaDb” maglumat bazasyna garaşlylyk 10 - “SpringBoot 16” - Lombok bilen baglanyşyk üçin garaşlylyk (gowy, meniň pikirimçe, munuň nähili libdigini her kim bilýär) 22 - synaglar üçin başlangyç (bize gerek JUnit ýerleşdirilen) 28 - başlangyç springJdbc bilen işlemek Geliň, synaglarymyz üçin zerur bolan noýba (esasanam, MariaDB dörediji noýba) bilen bahar konteýnerine göz aýlalyň:
@Configuration
public class TestConfigDB {

   @Bean
   public MariaDB4jSpringService mariaDB4jSpringService() {
       return new MariaDB4jSpringService();
   }

   @Bean
   public DataSource dataSource(MariaDB4jSpringService mariaDB4jSpringService) {
       try {
           mariaDB4jSpringService.getDB().createDB("testDB");
       } catch (ManagedProcessException e) {
         e.printStackTrace();
       }

       DBConfigurationBuilder config = mariaDB4jSpringService.getConfiguration();

       return DataSourceBuilder
               .create()
               .username("root")
               .password("root")
               .url(config.getURL("testDB"))
               .driverClassName("org.mariadb.jdbc.Driver")
               .build();
   }

   @Bean
   public JdbcTemplate jdbcTemplate(DataSource dataSource) {
       return new JdbcTemplate(dataSource);
   }
}
5 - MariaDB-ni ýokarlandyrmagyň esasy komponenti (Bahar çarçuwasyna esaslanýan programmalar üçin) 10 - maglumat bazasynyň noýbasyny kesgitlemek 12 - döredilen Maglumat bazasynyň adyny bellemek - 19-njy ýagdaýymyz üçin konfigurasiýalary çykarmak - Gurluşyk nusgasy bilen maglumat bazasyny gurmak ( nagyş barada gowy syn ) Netijede, maglumatlar bazasy bilen aragatnaşyk saklamak üçin JdbcTemplate noýbasy. Bu pikir, Tao synaglary üçin esasy synpymyz bolar, ondan Tao synag synplarynyň hemmesi miras alar, wezipeleri şulary öz içine alýar:
  1. esasy maglumatlar bazasynda ulanylýan käbir skriptleri işe girizmek (tablisalary döretmek, sütünleri üýtgetmek we başgalar);
  2. tablisalary synag maglumatlary bilen doldurýan synag skriptlerini işe girizmek;
  3. tablisalary pozmak.
@SpringBootTest(classes = TestConfigDB.class)
public abstract class DataBaseIT {

   @Autowired
   private JdbcTemplate jdbcTemplate;

   public JdbcTemplate getJdbcTemplate() {
       return jdbcTemplate;
   }

   public void fillDataBase(String[] initList) {
       for (String x : initList) {
           try {
               jdbcTemplate.update(IOUtils.resourceToString("/db.migrations/" + x, StandardCharsets.UTF_8));
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }

   public void cleanDataBase() {
       getJdbcTemplate().update("DROP database testDB");
       getJdbcTemplate().update("CREATE database testDB");
       getJdbcTemplate().update("USE testDB");
   }

   public void fillTables(String[] fillList) {
       for (String x : fillList) {
           try {
               Stream.of(
                       IOUtils.resourceToString("/fill_scripts/" + x, StandardCharsets.UTF_8))
                       .forEach(jdbcTemplate::update);
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }
}
1 - @SpringBootTest düşündirişini ulanyp, synag konfigurasiýasyny 11 goýduk - bu usulda argument hökmünde zerur tablisalaryň atlaryny geçýäris we jogapkärli işçi hökmünde olary bize ýükleýär (bu bize mümkinçilik berýär) bu usuly ýüregimiziň isleýşi ýaly gaýtadan ulanmak) 21 - bu usuly arassalamak üçin ulanýarys, ýagny 27-nji maglumat bazasyndaky ähli tablisalary (we olaryň maglumatlaryny) pozmak üçin - bu usuldaky argument synag maglumatlary bolan skriptleriň atlarydyr; belli bir usuly barlamak üçin ýüklener. Synag maglumatlary bilen skriptimiz:
INSERT INTO robots(name, cpu, producer)
VALUES ('Rex', 'Intel Core i5-9400F', 'Vietnam'),
      ('Molly', 'AMD Ryzen 7 2700X', 'China'),
      ('Ross', 'Intel Core i7-9700K', 'Malaysia')
Indi hemmämiziň şu gün üçin ýygnan zatlarymyz.

Tao synag synpy

@RunWith(SpringRunner.class)
public class RobotDataBaseIT extends DataBaseIT {

   private static RobotDAO countryDAO;

   @Before
   public void fillData() {
       fillDataBase(new String[]{
               "create_table_robots.sql"
       });
       countryDAO = new RobotDAOImpl(getJdbcTemplate());
   }

   @After
   public void clean() {
       cleanDataBase();
   }

   private RowMapper<Robot> robotMapper() {
       return (rs, rowNum) ->
               Robot.builder()
                       .id(rs.getLong("id"))
                       .name(rs.getString("name"))
                       .cpu(rs.getString("cpu"))
                       .producer(rs.getString("producer"))
                       .build();
   }
2 - synaglarymyz üçin esasy synpdan miras alýarys 4 - synagdan geçen ammarymyz 7 - her synagdan 8-de başlajak usul - zerur tablisalary ýüklemek üçin ene synp usulyny ulanýarys - dao 15-ni başlaýarys her synagdan soň başlar, maglumatlar bazamyzy arassalap 19 - Tao synpyna meňzeş RowMapper-iň durmuşa geçirilmegi, bir synag usulyndan öň we soň ulanylýan @Before we @After ulanýarys, ýöne bize rugsat berýän birneme lib alyp bileris bu synpyň ýerine ýetiriş synaglarynyň başyna we ahyryna bagly düşündirişleri ulanmak. Mysal üçin, synaglary ep-esli çaltlaşdyrjak bu , sebäbi her gezek we synpda bir gezek tablisalar döredilmeli we doly ýok edilmeli. Emma biz beýle etmeýäris. Name ucin sorayan? Usullaryň biri tablisanyň gurluşyny üýtgetse näme etmeli? Mysal üçin, bir sütüni pozuň. Bu ýagdaýda galan usullar şowsuz bolup biler ýa-da garaşylşy ýaly jogap bermelidir (mysal üçin, arka sütün dörediň). Munuň bize birek-birege synaglaryň gereksiz baglanyşygyny (garaşlylygyny) berýändigini boýun almalydyrys, munuň bize peýdasy ýok. Iöne ýalňyşýaryn, dowam edeliň ...

FindById usulyny barlamak

@Test
public void findByIdTest() {
   fillTables(new String[]{"fill_table_robots.sql"});

   Long id = getJdbcTemplate().queryForObject("SELECT id FROM robots WHERE name = 'Molly'", Long.class);
   Robot robot = countryDAO.findById(id);

   assertThat(robot).isNotNull();
   assertThat(robot.getId()).isEqualTo(id);
   assertThat(robot.getName()).isEqualTo("Molly");
   assertThat(robot.getCpu()).isEqualTo("AMD Ryzen 7 2700X");
   assertThat(robot.getProducer()).isEqualTo("China");
}
3 - tablisany synag maglumatlary 5 bilen dolduryň - 6 gerekli guramanyň idini alyň - synag edilýän usuly ulanyň 8 ... 12 - alnan maglumatlary garaşylýanlar bilen deňeşdiriň

Usul synagyny täzeläň

@Test
public void updateTest() {
   fillTables(new String[]{"fill_table_robots.sql"});

   Long robotId = getJdbcTemplate().queryForObject("SELECT id FROM robots WHERE name = 'Rex'", Long.class);

   Robot updateRobot = Robot.builder()
           .id(robotId)
           .name("Aslan")
           .cpu("Intel Core i5-3470")
           .producer("Narnia")
           .build();

   Robot responseRobot = countryDAO.update(updateRobot);
   Robot updatedRobot = getJdbcTemplate().queryForObject(
           "SELECT id, name, cpu, producer FROM robots WHERE id = ?",
           robotMapper(),
           robotId);

   assertThat(updatedRobot).isNotNull();
   assertThat(updateRobot.getName()).isEqualTo(responseRobot.getName());
   assertThat(updateRobot.getName()).isEqualTo(updatedRobot.getName());
   assertThat(updateRobot.getCpu()).isEqualTo(responseRobot.getCpu());
   assertThat(updateRobot.getCpu()).isEqualTo(updatedRobot.getCpu());
   assertThat(updateRobot.getProducer()).isEqualTo(responseRobot.getProducer());
   assertThat(updateRobot.getProducer()).isEqualTo(updatedRobot.getProducer());
   assertThat(responseRobot.getId()).isEqualTo(updatedRobot.getId());
   assertThat(updateRobot.getId()).isEqualTo(updatedRobot.getId());
}
3 - tablisany synag maglumatlary 5 bilen dolduryň - täzelenýän guramanyň şahsyýetini alyň 7 - täzelenen guramany guruň - synag edilýän usuly 15 ulanyň - 20 ... 28 barlamak üçin täzelenen guramany alyň - alnan maglumatlary deňeşdiriň garaşylýanlar Täzelenme usulyny barlamak, döretmäge meňzeýär. Iň bolmanda meniň üçin. Ylalaşygy isleýşiňiz ýaly öwrüp bilersiňiz: hiç haçan gaty köp barlag bolup bilmez. Synaglaryň doly işlemegini ýa-da kemçilikleriň ýoklugyny kepillendirmeýändigini belläsim gelýär. Synaglar diňe programmanyň hakyky netijesiniň (onuň bölegi) garaşylýan netijä laýyk gelýändigini kepillendirýär. Bu ýagdaýda diňe synaglaryň ýazylan bölekleri barlanýar.

Synaglar bilen synp açalyň ...

MySql - 7 çalyşmak üçin MariaDB ulanyp maglumat bazasynyň integrasiýa synagyOryeňiş)) Geliň, çaý taýýarlap, gutapjyk alalyň: biz oňa mynasyp)) MySql - 8-i çalyşmak üçin MariaDB ulanyp maglumat bazasynyň integrasiýa synagy

peýdaly baglanyşyklar

Okamagy gutaranlar üçin üns bereniňiz üçin we ... MySql - 9 çalyşmak üçin MariaDB ulanyp maglumat bazasynyň integrasiýa synagy

* “Wyldyz söweşleri” eposy *

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION