![MySql - 3 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ](https://cdn.javarush.com/images/article/6270633c-1cfa-4b46-aefc-4e5802ab06bd/1024.jpeg)
منصوبي جي جوڙجڪ
صرف متاثر ٿيل حصا ڏيکاريا ويا آهن:![MySql - 5 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ](https://cdn.javarush.com/images/article/261272f7-bc93-4174-ad23-5e6dec4c1162/1024.jpeg)
![MySql - 6 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ](https://cdn.javarush.com/images/article/8d8d0ffa-8898-454b-a100-d3e31ef73e73/1024.jpeg)
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 ٽيسٽ لاءِ هڪ مکيه ڪلاس هوندو، جنهن مان سڀئي ڊاءِ ٽيسٽ ڪلاس ورثي ۾ ملندا، جن جا ڪم شامل آهن:
- مکيه ڊيٽابيس ۾ استعمال ٿيل ڪجهه اسڪرپٽ شروع ڪرڻ (ٽيبل ٺاهڻ، ڪالمن کي تبديل ڪرڻ، ۽ ٻيا)؛
- ٽيسٽ اسڪرپٽ شروع ڪرڻ جيڪي ٽيسٽ ڊيٽا سان ٽيبل ڀريندا آهن؛
- حذف ڪرڻ واري ٽيبل.
@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 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ](https://cdn.javarush.com/images/article/de92a3ca-b8d0-4851-845f-9319f30828d8/original.jpeg)
![MySql - 8 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ](https://cdn.javarush.com/images/article/7cdd0ce2-ea39-4e8b-b499-522b2afb0fa0/original.jpeg)
مفيد لنڪس
- هن ٽيڪنالاجي اسٽيڪ جي اڻ پڙهيل حصي تي هڪ سٺو مضمون.
- Maven، Spring، MySQL، Hibernate بابت مضمونن جو هڪ دلچسپ سلسلو.
- اچو ته يونٽ ٽيسٽ تي اسان جي ياداشت کي ٿورو تازو ڪريون.
- انضمام جي جاچ جو هڪ دلچسپ مثال، پر PostgreSQL متبادل سان.
- ڪيترائي ماڻهو، ۽ نه رڳو تجربن ۾، استعمال ڪريو ماريا ڊي بي بدران MySql.
![MySql - 9 کي تبديل ڪرڻ لاءِ ماريا ڊي بي استعمال ڪندي ڊيٽابيس جي انٽيگريشن ٽيسٽ](https://cdn.javarush.com/images/article/151b0636-70a0-46c3-80e0-8307327ef4dc/1024.jpeg)
*ايپيڪ اسٽار وار ميوزڪ*
GO TO FULL VERSION