JavaRush /جاوا بلاگ /Random-UR /MySql کو تبدیل کرنے کے لیے ماریا ڈی بی کا استعمال کرتے ہو...

MySql کو تبدیل کرنے کے لیے ماریا ڈی بی کا استعمال کرتے ہوئے ڈیٹا بیس کی انٹیگریشن ٹیسٹنگ

گروپ میں شائع ہوا۔
MySql - 1 کو تبدیل کرنے کے لیے ماریا ڈی بی کا استعمال کرتے ہوئے ڈیٹا بیس کی انٹیگریشن ٹیسٹنگآج میں ٹیسٹنگ کے بارے میں بات کرنا چاہوں گا، کیونکہ کوڈ جتنا زیادہ ٹیسٹ کے ساتھ احاطہ کرتا ہے، اسے اتنا ہی بہتر اور زیادہ قابل اعتماد سمجھا جاتا ہے۔ آئیے یونٹ ٹیسٹنگ کے بارے میں نہیں بلکہ ڈیٹا بیس کے انٹیگریشن ٹیسٹنگ کے بارے میں بات کرتے ہیں۔ یونٹ ٹیسٹ اور انٹیگریشن ٹیسٹ میں بالکل کیا فرق ہے؟ MySql - 2 کو تبدیل کرنے کے لیے ماریا ڈی بی کا استعمال کرتے ہوئے ڈیٹا بیس کی انٹیگریشن ٹیسٹنگماڈیولر (یونٹ) انفرادی ماڈیولز، طریقوں یا کلاسوں کی سطح پر کسی پروگرام کی جانچ کر رہا ہے، یعنی ٹیسٹ تیز اور آسان ہیں، جو فعالیت کے سب سے زیادہ قابل تقسیم حصوں کو متاثر کرتے ہیں۔ انہیں "ایک ٹیسٹ فی طریقہ" بھی کہا جاتا ہے۔ انٹیگریشن والے سست اور بھاری ہوتے ہیں، اور کئی ماڈیولز اور اضافی فعالیت پر مشتمل ہوتے ہیں۔ MySql - 3 کو تبدیل کرنے کے لیے ماریا ڈی بی کا استعمال کرتے ہوئے ڈیٹا بیس کی انٹیگریشن ٹیسٹنگڈاؤ (ڈیٹا ایکسیس آبجیکٹ) پرت کے انضمام کے ٹیسٹ کیوں ہوتے ہیں؟ کیونکہ ڈیٹا بیس کے سوالات کے ساتھ طریقوں کو جانچنے کے لیے، ہمیں RAM میں ایک علیحدہ ڈیٹا بیس بنانے کی ضرورت ہے، اس کی جگہ مرکزی ڈیٹا بیس کو لے کر۔ خیال یہ ہے کہ ہم اپنی ضرورت کی میزیں بناتے ہیں، ان کو ٹیسٹ ڈیٹا سے بھرتے ہیں اور ریپوزٹری کلاس کے طریقوں کی درستگی کو چیک کرتے ہیں (آخر کار، ہم جانتے ہیں کہ کسی معاملے میں حتمی نتیجہ کیا ہونا چاہیے)۔ تو، چلو شروع کرتے ہیں. ڈیٹا بیس کو جوڑنے کے موضوعات پر طویل عرصے سے احاطہ کیا گیا ہے، اور اس وجہ سے آج میں اس پر توجہ نہیں دینا چاہوں گا، اور ہم پروگرام کے صرف ان حصوں پر غور کریں گے جو ہماری دلچسپی رکھتے ہیں۔ پہلے سے طے شدہ طور پر، ہم اس حقیقت سے شروع کریں گے کہ ہماری ایپلی کیشن اسپرنگ بوٹ پر مبنی ہے، اسپرنگ JDBC ڈاؤ پرت کے لیے (زیادہ وضاحت کے لیے)، ہمارا مرکزی ڈیٹا بیس MySQL ہے، اور ہم اسے MariaDB کا استعمال کرتے ہوئے تبدیل کریں گے (وہ زیادہ سے زیادہ مطابقت رکھتے ہیں، اور اس کے مطابق 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 بین۔ خیال یہ ہے کہ ہمارے پاس تاؤ ٹیسٹ کے لیے ایک مرکزی کلاس ہوگی، جس سے تمام تاؤ ٹیسٹ کلاسز وراثت میں آئیں گی، جن کے کاموں میں شامل ہیں:
  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 - ہم اپنے dao 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 - جس ہستی کی ہمیں ضرورت ہے اس کے لیے آئی ڈی حاصل کریں 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