JavaRush /Блоги Java /Random-TG /Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB б...

Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB барои иваз кардани MySql

Дар гурӯҳ нашр шудааст
Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB барои иваз кардани MySql - 1Имрӯз ман мехостам дар бораи санҷиш сухан гӯям, зеро ҳар қадар рамз бо тестҳо фаро гирифта шавад, ҳамон қадар беҳтар ва боэътимодтар ҳисобида мешавад. Биёед на дар бораи санҷиши воҳидҳо, балки дар бораи санҷиши интегралии пойгоҳи додаҳо сӯҳбат кунем. Фарқи байни санҷишҳои воҳид ва санҷишҳои ҳамгироӣ чӣ гуна аст? Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB барои иваз кардани MySql - 2Модулӣ (воҳид) санҷиши барнома дар сатҳи модулҳо, усулҳо ё синфҳои алоҳида мебошад, яъне санҷишҳо зуд ва осон буда, ба қисмҳои тақсимшавандаи функсия таъсир мерасонанд. Онҳо инчунин ҳамчун "як санҷиш барои як усул" номида мешаванд. Интегратсияҳо сусттар ва вазнинтаранд ва метавонанд аз якчанд модулҳо ва функсияҳои иловагӣ иборат бошанд. Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB барои иваз кардани MySql - 3Чаро санҷишҳо барои ҳамгироии қабати dao (Data Access Object) озмоиш мешаванд? Зеро барои санҷиши усулҳо бо дархостҳо ба пойгоҳи додаҳо, мо бояд дар RAM як пойгоҳи додаҳои алоҳидаро бо иваз кардани пойгоҳи асосӣ зиёд кунем. Идеяи он аст, ки мо ҷадвалҳои ба мо лозимиро эҷод мекунем, онҳоро бо маълумоти санҷишӣ пур мекунем ва дурустии усулҳои синфи репозиторийро тафтиш мекунем (охир, мо медонем, ки дар ҳолати додашуда натиҷаи ниҳоӣ бояд чӣ гуна бошад). Пас, биёед оғоз кунем. Мавзӯъҳо оид ба пайваст кардани пойгоҳи додаҳо кайҳо боз фаро гирифта шудаанд ва аз ин рӯ, имрӯз ман намехоҳам дар ин бора таваққуф кунам ва мо танҳо қисматҳои барномаро, ки ба мо таваҷҷӯҳ доранд, баррасӣ хоҳем кард. Бо нобаёнӣ, мо аз он оғоз хоҳем кард, ки барномаи мо ба Spring Boot асос ёфтааст, барои қабати Spring JDBC dao (барои возеҳтар), базаи асосии мо MySQL мебошад ва мо онро бо истифода аз MariaDB иваз мекунем (онҳо ба ҳадди аксар мувофиқанд ва мувофиқан скриптҳои MySQL ҳеҷ гоҳ бо лаҳҷаи MariaDB низоъ нахоҳад буд, чуноне ки бо H2 вуҷуд дорад). Мо инчунин шартан фарз мекунем, ки барномаи мо Liquibase-ро барои идора ва татбиқи тағирот ба схемаи пойгоҳи додаҳо истифода мебарад ва мувофиқан ҳамаи скриптҳои татбиқшуда дар замимаи мо нигоҳ дошта мешаванд.

Сохтори лоиҳа

Танҳо қисмҳои зарардида нишон дода мешаванд: Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB барои иваз кардани MySql - 5Ва ҳа, имрӯз мо роботҳоро эҷод мекунем)) Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB барои иваз кардани MySql - 6Скрипт барои ҷадвал, усулҳое, ки мо имрӯз барои он озмоиш хоҳем кард (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;
Ташкилоте, ки ин ҷадвалро намояндагӣ мекунад:
@Builder
@Data
public class Robot {

   private Long id;

   private String name;

   private String cpu;

   private String producer;
}
Интерфейси анбори санҷидашуда:
public interface RobotDAO {

   Robot findById(Long id);

   Robot create(Robot robot);

   List<Robot> findAll();

   Robot update(Robot robot);

   void delete(Long id);
}
Воқеан, дар ин ҷо амалиёти стандартии CRUD бидуни экзотикӣ мавҷуданд, аз ин рӯ мо татбиқи на ҳама усулҳоро баррасӣ хоҳем кард (хуб, ин ҳеҷ касро ба ҳайрат намеорад), аммо баъзеҳо - барои кӯтоҳтар:
@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();
   }
Биёед каме канорагирӣ кунем ва бубинем, ки вобастагии мо чӣ мешавад (танҳо онҳое, ки барои қисми намоишии барнома истифода мешаванд, пешниҳод карда мешаванд):
<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 10 - вобастагӣ барои пайвастшавӣ бо SpringBoot 16 - Ломбок (хуб, ман фикр мекунам ҳама медонад, ки ин чӣ гуна lib аст) 22 - оғозкунанда барои санҷишҳо (дар он ҷо JUnit ба мо лозим аст) 28 - оғозкунанда барои Кор бо springJdbc Биёед як контейнери баҳорӣ бо лӯбиёи барои санҷишҳои мо заруриро бубинем (аз ҷумла, лӯбиёи эҷоди MariaDB):
@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 (барои барномаҳо дар асоси чаҳорчӯбаи Springwork) 10 - муайян кардани пойгоҳи додаҳо 12 - муқаррар кардани номи пойгоҳи додаҳо 17 - баровардани конфигуратсияҳо барои ҳолати мо 19 - сохтани пойгоҳи додаҳо бо истифода аз намунаи Builder ( Шарҳи хуби намуна ) Ва ниҳоят, он чизе ки ҳама ғавғо дар бораи он аст, лӯбиёи JdbcTemplate барои иртибот бо пойгоҳи додаҳо мебошад. Идея дар он аст, ки мо барои санҷишҳои Дао як синфи асосӣ хоҳем дошт, ки аз он ҳама синфҳои санҷишии Дао мерос мегиранд, ки вазифаҳои онҳо иборатанд аз:
  1. оғози баъзе скриптҳои дар базаи асосӣ истифодашаванда (скриптҳо барои сохтани ҷадвалҳо, тағир додани сутунҳо ва ғайра);
  2. оғози скриптҳои санҷишӣ, ки ҷадвалҳоро бо маълумоти тестӣ пур мекунанд;
  3. нест кардани ҷадвалҳо.
@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 мо конфигуратсияи санҷиширо муқаррар мекунем 11 - ҳамчун далел дар ин усул мо номҳои ҷадвалҳои ба мо лозимиро мегузорем ва ӯ ҳамчун як коргари масъул, онҳоро барои мо бор мекунад (ки ба мо имконият медиҳад) барои дубора истифода бурдани ин усул ба қадри дor мо) 21 - мо ин усулро барои тоза кардан истифода мебарем, яъне нест кардани ҳамаи ҷадвалҳо (ва маълумоти онҳо) аз пойгоҳи додаҳо 27 - аргумент дар ин усул массиви номҳои скриптҳо бо маълумоти санҷишӣ мебошад ки барои санҷиши усули мушаххас бор карда мешавад. Скрипти мо бо маълумоти санҷиш:
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')
Ва ҳоло он чизе ки мо барои имрӯз ҷамъ овардаем.

Синфи санҷиши Tao

@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 - мо аз синфи асосӣ барои санҷишҳои худ мерос мегирем 4 - анбори санҷидашудаи мо 7 - усуле, ки пеш аз ҳар як санҷиш оғоз мешавад 8 - мо усули синфи волидайнро барои бор кардани ҷадвалҳои зарурӣ истифода мебарем 11 - мо дао 15 -и худро оғоз мекунем. ки пас аз ҳар як санҷиш оғоз карда мешавад, пойгоҳи додаи моро тоза мекунад 19 - татбиқи RowMapper-и мо, ки ба синфи Tao монанд аст, мо @Before ва @After-ро истифода мебарем, ки пеш аз як усули санҷиш ва пас аз як усули санҷиш истифода мешаванд, аммо мо метавонем якчанд lib-ро гирем, ки ба мо имкон медиҳад истифода бурдани эзоҳҳои марбут ба оғози санҷишҳои иҷрои ин синф ва анҷом. Масалан, ин , ки санҷишҳоро ба таври назаррас суръат мебахшад, зеро ҷадвалҳо бояд ҳар дафъа ва як маротиба дар як синф сохта ва пурра нест карда шаванд. Аммо мо ин корро намекунем. Чаро, шумо мепурсед? Чӣ мешавад, агар яке аз усулҳо сохтори ҷадвалро тағир диҳад? Масалан, як сутунро нест кунед. Дар ин ҳолат, усулҳои боқимонда метавонанд ё ноком шаванд ё бояд мувофиқи интизорӣ ҷавоб диҳанд (масалан, сутуни қафоро эҷод кунед). Мо бояд иқрор шавем, ки ин ба мо пайвастагии нолозим (вобастагии) санҷишҳоро ба ҳамдигар медиҳад, ки барои мо фоидае надорад. Аммо ман саркашӣ мекунам, биёед идома диҳем ...

Озмоиши усули findById

@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 - ҷадвалро бо маълумотҳои санҷиш пур кунед 5 - ID-и an objectи ба мо лозимиро гиред 6 - усули санҷидашударо истифода баред 8...12 - маълумоти гирифташударо бо маълумоти пешбинишуда муқоиса кунед

Санҷиши усули навсозӣ

@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 - ҷадвалро бо маълумоти санҷиш пур кунед 5 - идентификатсияи an objectи навсозӣшавандаро гиред 7 - an objectи навсозӣшударо созед 14 - усули санҷидашударо истифода баред 15 - an objectи навшударо барои санҷиш гиред 20...28 - маълумоти гирифташударо бо онҳое, ки интизоранд, Санҷиши усули навсозӣ ба эҷод монанд аст. Ақаллан барои ман. Шумо метавонед мусолиҳаҳоро ба қадре ки мехоҳед, печонед: ҳеҷ гоҳ чекҳои аз ҳад зиёд буда наметавонанд. Ман инчунин мехоҳам қайд намоям, ки санҷишҳо пурра кор кардан ё набудани хатогиҳоро кафолат намедиҳанд. Санҷишҳо танҳо кафолат медиҳанд, ки натиҷаи воқеии барнома (порчаи он) ба натиҷаи пешбинишуда мувофиқат мекунад. Дар ин ҳолат, танҳо он қисмҳое, ки барои онҳо санҷишҳо навишта шудаанд, тафтиш карда мешаванд.

Биёед як синфро бо тестҳо оғоз кунем ...

Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB барои иваз кардани MySql - 7Ғалаба)) Биёед чой дам кунем ва печенье гирем: мо сазоворем)) Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB барои иваз кардани MySql - 8

истинодҳои муфид

Барои онҳое, ки хонданро тамом кардаанд, ташаккур барои таваҷҷуҳ ва... Санҷиши ҳамгироии пойгоҳи додаҳо бо истифода аз MariaDB барои иваз кардани MySql - 9

*мусиқии эпикии Ҷангҳои Ситораҳо*

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION