JavaRush /جاوا بلاگ /Random-SD /MySql کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس ...

MySql کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ

گروپ ۾ شايع ٿيل
MySql - 1 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽاڄ آئون ٽيسٽ بابت ڳالهائڻ چاهيندس، ڇاڪاڻ ته وڌيڪ ڪوڊ ٽيسٽ سان ڍڪيل آهي، اهو بهتر ۽ وڌيڪ قابل اعتماد سمجهيو ويندو آهي. اچو ته يونٽ جي جاچ بابت نه، پر ڊيٽابيس جي انضمام جي جاچ بابت. يونٽ ٽيسٽ ۽ انٽيگريشن ٽيسٽ جي وچ ۾ ڇا فرق آهي؟ MySql - 2 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽماڊلر (يونٽ) انفرادي ماڊلز، طريقن يا طبقن جي سطح تي هڪ پروگرام کي جانچيندي آهي، يعني ٽيسٽ تيز ۽ آسان آهن، ڪارڪردگي جي سڀ کان وڌيڪ تقسيم حصن کي متاثر ڪندي. انهن کي پڻ حوالو ڏنو ويو آهي "هڪ ٽيسٽ في طريقو". انضمام وارا سست ۽ ڳري آهن، ۽ ڪيترن ئي ماڊلز ۽ اضافي ڪارڪردگي تي مشتمل هوندا. MySql - 3 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽڊيو (ڊيٽا رسائي آبجیکٹ) پرت انٽيگريشن ٽيسٽ لاءِ ٽيسٽ ڇو آهن؟ ڇاڪاڻ ته ڊيٽابيس جي سوالن سان طريقن کي جانچڻ لاء، اسان کي رام ۾ هڪ الڳ ڊيٽابيس کي وڌائڻ جي ضرورت آهي، مکيه کي تبديل ڪندي. خيال اهو آهي ته اسان ٽيبل ٺاهيون ٿا جيڪي اسان کي گهربل آهن، انهن کي ٽيسٽ ڊيٽا سان ڀريو ۽ ريپوزٽري ڪلاس جي طريقن جي درستگي کي جانچيو (آخر، اسان ڄاڻون ٿا ته آخري نتيجو ڇا ٿيڻ گهرجي هڪ ڏنل صورت ۾). سو، اچو ته شروع ڪريون. ڊيٽابيس کي ڳنڍڻ جا موضوع ڊگھي عرصي تائين ڍڪيل آهن، ۽ تنهن ڪري اڄ آئون ان تي رهڻ نه چاهيندس، ۽ اسان پروگرام جي صرف انهن حصن تي غور ڪنداسين جيڪي اسان جي دلچسپي رکن ٿا. ڊفالٽ طور، اسان ان حقيقت کان شروع ڪنداسين ته اسان جي ايپليڪيشن اسپرنگ بوٽ تي ٻڌل آهي، اسپرنگ JDBC داو پرت لاءِ (وڌيڪ وضاحت لاءِ)، اسان جو مکيه ڊيٽابيس MySQL آهي، ۽ اسين ان کي ماريا ڊي بي استعمال ڪندي تبديل ڪنداسين (اهي وڌ ۾ وڌ مطابقت رکندڙ آهن، ۽ ان جي مطابق MySQL اسڪرپٽ ڪڏهن به ماريا ڊي بي ڊيليڪٽ سان ڪو به تڪرار نه ٿيندو، جيئن اتي H2 سان هوندو). اسان به شرطي طور تي فرض ڪنداسين ته اسان جو پروگرام ڊيٽابيس اسڪيما ۾ تبديلين کي منظم ڪرڻ ۽ لاڳو ڪرڻ لاءِ Liquibase استعمال ڪري ٿو، ۽ ان جي مطابق، سڀئي لاڳو ٿيل اسڪرپٽ اسان جي ايپليڪيشن ۾ محفوظ ٿيل آهن.

منصوبي جي جوڙجڪ

صرف متاثر ٿيل حصا ڏيکاريا ويا آهن: MySql - 5 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ۽ ها، اڄ اسان روبوٽس ٺاهينداسين)) 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 آپريشنز آهن، بغير exotics، تنهنڪري اسان سڀني طريقن جي عمل تي غور ڪنداسين (چڱو، اهو ڪنهن کي حيران نه ٿيندو)، پر ڪجهه - وڌيڪ اختصار لاء:
@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 - خود ماريا ڊي بي ڊيٽابيس لاءِ انحصار 10 - اسپرنگ بوٽ 16 سان ڳنڍڻ لاءِ انحصار - لومبوڪ (چڱو، مان سمجهان ٿو ته هرڪو ڄاڻي ٿو ته هي ڪهڙي قسم جو ليب آهي) 22 - ٽيسٽ لاءِ اسٽارٽر (جتي اسان کي JUnit جي ضرورت آهي) 28 - اسٽارٽر لاءِ springJdbc سان ڪم ڪريون اچو ته هڪ نظر وٺون اسپرنگ ڪنٽينر سان گڏ اسان جي ٽيسٽن لاءِ گهربل بينز (خاص طور تي، ماريا ڊي بي تخليق بين):
@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 - ماريا ڊي بي کي وڌائڻ جو بنيادي حصو (اسپرنگ فريم ورڪ جي بنياد تي ايپليڪيشنن لاءِ) 10 - ڊيٽابيس جي وضاحت ڪرڻ 12 - ٺاهيل ڊيٽابيس جو نالو ترتيب ڏيڻ 17 - اسان جي ڪيس لاءِ ترتيبن کي ڪڍڻ 19 - بلڊر جي نموني کي استعمال ڪندي ڊيٽابيس ٺاهڻ ( نموني جو هڪ سٺو جائزو ) ۽ آخر ۾، جيڪو تمام گڙٻڙ آهي، اهو آهي JdbcTemplate بين سان رابطي لاءِ ڊيٽابيس کي اٿاريو پيو وڃي. خيال اهو آهي ته اسان وٽ Tao ٽيسٽ لاءِ هڪ مکيه ڪلاس هوندو، جنهن مان سڀئي ڊاءِ ٽيسٽ ڪلاس ورثي ۾ ملندا، جن جا ڪم شامل آهن:
  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 ترتيب ڏيون ٿا - هن طريقي ۾ هڪ دليل جي طور تي اسان انهن ٽيبلن جا نالا پاس ڪريون ٿا جن جي اسان کي ضرورت آهي، ۽ هو، هڪ ذميوار محنتي جي حيثيت سان، انهن کي اسان لاءِ لوڊ ڪندو (جيڪو اسان کي موقعو ڏئي ٿو. هن طريقي کي ٻيهر استعمال ڪرڻ لاءِ جيترو اسان جي دل چاهي ٿي) 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')
۽ هاڻي جيڪو اسان سڀني کي اڄ لاء گڏ ڪيو آهي.

تائو ٽيسٽنگ ڪلاس

@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 استعمال ڪريون ٿا، جيڪي هڪ ٽيسٽ جي طريقي کان اڳ ۽ بعد ۾ استعمال ڪيا وڃن ٿا، پر اسان ڪجهه ليب وٺي سگهون ٿا جيڪا اسان کي اجازت ڏئي ٿي. هن ڪلاس ۽ آخر جي executions ٽيسٽ جي شروعات سان لاڳاپيل تشريحون استعمال ڪرڻ لاءِ. مثال طور، هي هڪ ، جيڪو خاص طور تي ٽيسٽ کي تيز ڪندو، ڇو ته جدولن کي ٺاهڻو پوندو ۽ مڪمل طور تي ختم ڪيو وڃي هر وقت، ۽ هڪ ڀيرو في ڪلاس. پر اسان اهو نه ڪندا آهيون. ڇو، تون پڇين ٿو؟ ڇا جيڪڏهن طريقن مان هڪ ٽيبل جي جوڙجڪ کي تبديل ڪري ٿو؟ مثال طور، ھڪڙي ڪالمن کي ختم ڪريو. انهي حالت ۾، باقي طريقا يا ته ناڪام ٿي سگهن ٿا يا جواب ڏيڻ گهرجن جيئن توقع ڪئي وڃي (مثال طور، هڪ واپس ڪالم ٺاهيو). اسان کي اهو تسليم ڪرڻو پوندو ته هي اسان کي هڪ ٻئي تي ٽيسٽن جو غير ضروري تعلق (انحصار) ڏئي ٿو، جيڪو اسان لاءِ ڪو به فائدو نه آهي. پر مان سمجهان ٿو، اچو ته جاري رکو ...

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 - ان اداري جي سڃاڻپ حاصل ڪريو جنهن جي اسان کي ضرورت آهي 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 - تازه ڪاري ٿيل اداري جي سڃاڻپ حاصل ڪريو 7 - اپڊيٽ ٿيل ادارو ٺاهيو 14 - آزمائشي طريقي سان استعمال ڪريو 15 - تصديق لاءِ اپڊيٽ ٿيل ادارو حاصل ڪريو 20...28 - حاصل ڪيل ڊيٽا سان ڀيٽ ڪريو توقع ٿيل جيڪي تازه ڪاري جو طريقو جانچڻ سان ٺاھڻ سان ملندڙ جلندڙ آھي. گهٽ ۾ گهٽ مون لاء. توهان مصالحت کي موڙي سگهو ٿا جيترو توهان چاهيو: اتي ڪڏهن به تمام گهڻو چيڪ نه ٿي سگهي. مان اهو پڻ نوٽ ڪرڻ چاهيان ٿو ته ٽيسٽ مڪمل ڪارڪردگي يا ڪيچ جي غير موجودگي جي ضمانت نه ڏيندا آهن. ٽيسٽ صرف انهي ڳالهه کي يقيني بڻائي ٿو ته پروگرام جو حقيقي نتيجو (ان جو ٽڪرو) متوقع هڪ سان ملندو آهي. انهي حالت ۾، صرف انهن حصن جي جانچ ڪئي وئي آهي جنهن لاء ٽيسٽ لکيو ويو آهي.

اچو ته ٽيسٽ سان ڪلاس شروع ڪريون...

MySql - 7 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽفتح)) اچو ته چانهه ٺاهيون ۽ ڪوڪيز وٺون: اسان ان جا مستحق آهيون)) MySql - 8 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ

مفيد لنڪس

انهن لاءِ جن پڙهڻ مڪمل ڪيو آهي، توهان جي توجه جي مهرباني ۽ ... MySql - 9 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ

*ايپيڪ اسٽار وار ميوزڪ*

تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION