9. 🧪 Тест болон дебаг
9.1 eGovFrame хөгжүүлэлтийн хэрэгсэл танилцуулга
eGovFrame хөгжүүлэлтийн хэрэгсэл нь Eclipse суурьтай интеграцчилсан хөгжүүлэлтийн орчин (IDE) бөгөөд HONGIKINGAN CMS хөгжүүлэлт болон тестэд зориулсан олон төрлийн функцийг үзүүлдэг.
9.1.1 Хөгжүүлэлтийн хэрэгслийн үндсэн функц
Үндсэн функц
- Төсөл үүсгэх болон удирдах: eGovFrame суурьтай төсөл үүсгэх болон удирдах
- Код загвар: Стандарт код загвар үзүүлэх
- Дебаг хэрэгсэл: Хүчтэй дебаг функц үзүүлэх
- Тест хэрэгсэл: JUnit суурьтай тест дэмжлэг
- Байршуулах хэрэгсэл: Сервер байршуулах функц үзүүлэх
9.1.2 Хөгжүүлэлтийн хэрэгсэл суулгах болон бүрдүүлэх
eGovFrame хөгжүүлэлтийн хэрэгсэл нь Eclipse суурьтай үзүүлэгддэг бөгөөд дараах байдлаар суулгах боломжтой:
📥 Хөгжүүлэлтийн орчин татаж авах
eGovFrame портал (www.egovframe.go.kr)-аас хөгжүүлэлтийн орчин татаж авах
📂 Задлах
Татаж авсан файлыг задлах
🚀 Ажиллуулах
Eclipse ажиллуулах файл (eclipse.exe) ажиллуулах
9.2 Хөгжүүлэлтийн хэрэгсэл суурьтай тест арга
9.2.1 JUnit тест бичих болон ажиллуулах
eGovFrame-д JUnit ашиглан нэгж тест бичиж ажиллуулах боломжтой.
Тест класс үүсгэх арга
🎯 Тест класс сонгох
Тестлэх класс дээр баруун товшилт > New > JUnit Test Case сонгох
⚙️ Тохиргоо
Тест класс нэр болон тестлэх метод сонгох
✅ Үүсгэх дуусгах
Finish товчийг дарж тест класс үүсгэх
[Бодит код] JUnit тест класс жишээ
package humanframe.test.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import humanframe.backoffice.service.BbsService;
import humanframe.backoffice.vo.BbsVO;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:humanframe/spring/context-common.xml",
"classpath:humanframe/spring/context-datasource.xml",
"classpath:humanframe/spring/context-mapper.xml"
})
public class BbsServiceTest {
@Autowired
private BbsService bbsService;
@Test
public void testSelectBbs() {
// Тест ажиллуулах
BbsVO bbs = bbsService.selectBbs(1);
// Үр дүн шалгах
assertNotNull(bbs);
assertEquals(1, bbs.getBbsNo());
}
}
Тест ажиллуулах арга
🎯 Тест сонгох
Тест класс эсвэл метод дээр баруун товшилт
▶️ Ажиллуулах
Run As > JUnit Test сонгох
📊 Үр дүн шалгах
JUnit харагдац дээр тестийн үр дүн шалгах (ногоон: амжилт, улаан: алдаа)
9.2.2 Тестийн хамрах хүрээ шинжилгээ
Eclipse дээр EclEmma нэмэлт хэрэгсэл ашиглан тестийн хамрах хүрээг шинжлэх боломжтой.
EclEmma ашиглах арга
🎯 Тест сонгох
Тест класс эсвэл метод дээр баруун товшилт
📊 Хамрах хүрээ ажиллуулах
Coverage As > JUnit Test сонгох
📈 Үр дүн шалгах
Хамрах хүрээний үр дүн шалгах (ногоон: хамрагдсан, улаан: хамрагдаагүй, шар: хэсэгчлэн хамрагдсан)
9.3 eGovFrame дебаг арга
9.3.1 Дебаг горим ажиллуулах
Eclipse дээр дебаг горимоор аппликейшн ажиллуулах арга дараах байдалтай:
🚀 Дебаг ажиллуулах
Төсөл дээр баруун товшилт > Debug As > Debug on Server сонгох
🖥️ Сервер сонгох
Сервер сонгосны дараа Finish товчийг дарах
🔄 Харагдац солих
Дебаг харагдац руу автоматаар солигдох
9.3.2 Зогсоох цэг (Breakpoint) тохируулах болон удирдах
Зогсоох цэг тохируулах арга
- Код засварлагч дээр зогсоох цэг тохируулах мөрийн зүүн захын хоосон хэсэг дээр давхар товшилт
- Эсвэл мөр дээр баруун товшилт > Toggle Breakpoint сонгох
Зогсоох цэгийн төрөл
Зогсоох цэгийн төрөл
- Мөрийн зогсоох цэг: Тодорхой мөр дээр гүйцэтгэлийг зогсоох
- Нөхцөлт зогсоох цэг: Тодорхой нөхцөл хангагдах үед л гүйцэтгэлийг зогсоох
→ Зогсоох цэг дээр баруун товшилт > Breakpoint Properties > нөхцөл оруулах - Онцгой байдлын зогсоох цэг: Тодорхой онцгой байдал үүсэх үед гүйцэтгэлийг зогсоох
→ Run > Add Java Exception Breakpoint сонгох
Зогсоох цэг удирдах
- Зогсоох цэг идэвхжүүлэх/идэвхгүй болгох: Зогсоох цэг дээр баруун товшилт > Enable/Disable
- Зогсоох цэг устгах: Зогсоох цэг дээр баруун товшилт > Remove
- Бүх зогсоох цэг харах: Window > Show View > Breakpoints
9.3.3 Дебаг удирдлагын функц
Дебаг горимд гүйцэтгэлийг удирдах үндсэн функцууд дараах байдалтай:
| Функц | Товчлуур | Тайлбар |
|---|---|---|
| Resume | F8 | Дараагийн зогсоох цэг хүртэл ажиллуулах |
| Suspend | - | Ажиллаж буй thread-ийг түр зогсоох |
| Terminate | Ctrl+F2 | Дебаг сессийг дуусгах |
| Step Into | F5 | Одоогийн мөрийн метод дотор орох |
| Step Over | F6 | Одоогийн мөр ажиллуулсны дараа дараагийн мөр рүү шилжих |
| Step Return | F7 | Одоогийн метод ажиллуулж дуусгасны дараа дуудсан газар руу буцах |
| Drop to Frame | - | Одоогийн stack frame-ийн эхлэл рүү буцах |
9.3.4 Хувьсагч болон илэрхийлэл ажиглах
Хувьсагчийн утга шалгах
Хувьсагч шалгах арга
- Variables харагдац: Одоогийн хүрээний хувьсагчийн утгыг харуулах
- Expressions харагдац: Хэрэглэгчийн тодорхойлсон илэрхийлэлийг үнэлэх
→ Add Watch Expression товчийг дарж илэрхийлэл нэмэх - Хулгана дарах: Хувьсагч дээр хулгана тавиж утгыг шалгах
Хувьсагчийн утга өөрчлөх
🎯 Хувьсагч сонгох
Variables харагдац дээр хувьсагч сонгох
✏️ Утга өөрчлөх
Баруун товшилт > Change Value сонгох
✅ Хэрэглэх
Шинэ утга оруулсны дараа OK товчийг дарах
9.3.5 Stack trace шинжилгээ
Debug харагдац ашиглах
- Одоо ажиллаж буй thread болон stack trace-ийг харуулах
- Stack frame дээр давхар товшиж тухайн байршил руу шилжих
- Thread-ийн төлөв шалгах (ажиллаж буй, түр зогссон, дууссан гэх мэт)
Stack trace шинжилгээний арга
📋 Stack trace шалгах
Онцгой байдал үүсэх үед консол харагдац дээр гарсан stack trace шалгах
🔍 Кодын хэсэг олох
Stack trace дээрээс өөрийн кодын хэсгийг олох
🐛 Асуудал тодорхойлох
Тухайн мөр рүү шилжиж асуудлын шалтгааныг тодорхойлох
9.4 Логлох болон лог шинжилгээ
9.4.1 eGovFrame логлох тохиргоо
eGovFrame нь Log4j ашиглан логлохыг хэрэгжүүлдэг.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Консол гаралт -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %5p [%c] %m%n" />
</layout>
</appender>
<!-- Файл гаралт -->
<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${LOG_PATH}/humanframe.log" />
<param name="Append" value="true" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %5p [%c] %m%n" />
</layout>
</appender>
<!-- SQL лог -->
<logger name="jdbc.sqlonly" additivity="false">
<level value="INFO" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</logger>
<!-- Аппликейшний лог -->
<logger name="humanframe" additivity="false">
<level value="DEBUG" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</logger>
<!-- Үндсэн logger -->
<root>
<priority value="INFO" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
</log4j:configuration>
Логийн түвшин
| Түвшин | Тайлбар |
|---|---|
| FATAL | Ноцтой алдаа, аппликейшн зогсох |
| ERROR | Алдаа, функц ажиллахгүй |
| WARN | Анхааруулга, болзошгүй асуудал |
| INFO | Мэдээлэл, гол үйл явдал |
| DEBUG | Дебаг мэдээлэл, дэлгэрэнгүй гүйцэтгэлийн мэдээлэл |
| TRACE | Хамгийн дэлгэрэнгүй мэдээлэл |
9.4.2 Лог бичих арга
Код дээр лог бичих арга дараах байдалтай:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class BbsServiceImpl implements BbsService {
private static final Logger logger = LoggerFactory.getLogger(BbsServiceImpl.class);
@Override
public BbsVO selectBbs(int bbsNo) {
logger.debug("Самбар харах: bbsNo={}", bbsNo);
try {
BbsVO bbs = bbsDAO.selectBbs(bbsNo);
logger.debug("Самбар харах үр дүн: {}", bbs);
return bbs;
} catch (Exception e) {
logger.error("Самбар харах үед алдаа гарлаа: {}", e.getMessage(), e);
throw e;
}
}
}
9.4.3 Eclipse дээр лог файл шинжлэх
Eclipse дээр лог файлыг шинжлэх арга дараах байдалтай:
📂 Лог файл нээх
- File > Open File цэс сонгох
- Лог файл сонгосны дараа Open товчийг дарах
🔍 Лог хайх
- Ctrl+F товчлуураар хайлтын харилцах цонх нээх
- Хайх үг оруулсны дараа Find товчийг дарах
- Тогтмол илэрхийлэл хайлт ашиглах (жишээ: ERROR|WARN)
🔧 Лог шүүх
- Лог харагч нэмэлт хэрэгсэл суулгах (LogViewer, EclipseLogViewer гэх мэт)
- Лог түвшин, цаг, мессеж гэх мэтээр шүүх
9.5 SQL асуулга дебаг
9.5.1 MyBatis лог тохиргоо
MyBatis асуулгыг дебаг хийхэд зориулсан лог тохиргооны арга дараах байдалтай:
log4jdbc тохиргоо
📦 Хамаарал нэмэх
pom.xml дээр хамаарал нэмэх:
<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>
🔧 DataSource тохиргоо өөрчлөх
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="net.sf.log4jdbc.DriverSpy"/>
<property name="url" value="jdbc:log4jdbc:mysql://localhost:3306/humanframe"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</bean>
📝 log4j.xml-д logger нэмэх
<logger name="jdbc.sqlonly" additivity="false">
<level value="INFO"/>
<appender-ref ref="console"/>
</logger>
<logger name="jdbc.sqltiming" additivity="false">
<level value="INFO"/>
<appender-ref ref="console"/>
</logger>
<logger name="jdbc.audit" additivity="false">
<level value="WARN"/>
<appender-ref ref="console"/>
</logger>
<logger name="jdbc.resultset" additivity="false">
<level value="WARN"/>
<appender-ref ref="console"/>
</logger>
<logger name="jdbc.resultsettable" additivity="false">
<level value="INFO"/>
<appender-ref ref="console"/>
</logger>
9.5.2 SQL зураг дебаг
MyBatis SQL зургийг дебаг хийх арга дараах байдалтай:
📄 SQL газрын зураг файл шалгах
- src/main/resources/humanframe/sqlmap/ хавтас дахь холбогдох SQL газрын зураг файл нээх
- SQL асуулгын дүрэм шалгах
🔍 Параметр шалгах
- Дебаг горимд зогсоох цэг тохируулах
- Variables харагдац дээр параметрийн утга шалгах
📋 SQL лог шалгах
- Консол эсвэл лог файлаас ажиллуулсан SQL асуулга шалгах
- Холбогдсон параметрийн утга шалгах
🔄 Үр дүнгийн зураглал шалгах
- Үр дүнгийн объектын талбар болон SQL үр дүнгийн багана зураглал шалгах
- Төрөл хөрвүүлэх алдаа шалгах
9.6 Ерөнхий алдаа болон шийдлийн арга
9.6.1 Компайл алдаа
Гол компайл алдаа болон шийдлийн арга
- Класс олдохгүй:
→ Шалтгаан: Классын зам асуудал эсвэл хамаарал дутуу
→ Шийдэл: Төсөл дээр баруун товшилт > Maven > Update Project - Метод олдохгүй:
→ Шалтгаан: API өөрчлөгдсөн эсвэл сангийн хувилбар таарахгүй
→ Шийдэл: Методын гарын үсэг болон сангийн хувилбар шалгах - Синтакс алдаа:
→ Шалтгаан: Буруу Java синтакс
→ Шийдэл: Код шалгаж засах
9.6.2 Runtime алдаа
Гол runtime алдаа болон шийдлийн арга
- NullPointerException:
→ Шалтгаан: null объект лавлагаа
→ Шийдэл: Объект эхлүүлэлт шалгах болон null шалгалт нэмэх - ClassNotFoundException:
→ Шалтгаан: Класс ачаалах алдаа
→ Шийдэл: Классын зам шалгах болон хамаарал нэмэх - SQLException:
→ Шалтгаан: Өгөгдлийн сангийн холболт эсвэл асуулгын алдаа
→ Шийдэл: SQL асуулга болон өгөгдлийн сангийн холболтын тохиргоо шалгах
9.6.3 Веб аппликейшны алдаа
Гол веб аппликейшны алдаа болон шийдлийн арга
- 404 Not Found:
→ Шалтгаан: URL зураглалын алдаа эсвэл нөөц дутуу
→ Шийдэл: Контроллерын зураглал болон нөөцийн зам шалгах - 500 Internal Server Error:
→ Шалтгаан: Серверийн талын онцгой байдал үүссэн
→ Шийдэл: Лог файлаас онцгой байдлын stack trace шалгах болон дебаг хийх - 400 Bad Request:
→ Шалтгаан: Буруу хүсэлтийн параметр
→ Шийдэл: Хүсэлтийн параметр шалгах болон засах
9.7 Дебагийн шилдэг туршлага
9.7.1 Үр дүнтэй дебаг стратеги
🔄 Асуудал дахин гаргах
- Асуудлыг тогтмол дахин гаргах боломжтой арга олох
- Дахин гаргах алхмуудыг баримтжуулах
📋 Лог шинжилгээ
- Лог файлаас алдааны мессеж болон stack trace шалгах
- Лог түвшин тохируулж дэлгэрэнгүй мэдээлэл цуглуулах
🎯 Зогсоох цэгийн стратеги
- Асуудал гарах газрын ойролцоо зогсоох цэг тохируулах
- Нөхцөлт зогсоох цэг ашиглах
🔬 Таамаглал баталгаажуулах
- Асуудлын шалтгааны талаар таамаглал дэвшүүлэх
- Дебагаар таамаглалыг баталгаажуулах
9.7.2 Дебаг хэрэгслийн ашиглалтын зөвлөмж
Дебаг хэрэгслийн ашиглалтын зөвлөмж
- Нөхцөлт зогсоох цэг ашиглах:
→ Тодорхой нөхцөлд л зогсохоор тохируулах
→ Давталт дээр тодорхой давталтын тоонд л зогсох - Watch илэрхийлэл ашиглах:
→ Нарийн илэрхийлэл үнэлэх
→ Объектын төлөв хянах - Hot Code Replace ашиглах:
→ Дебаг горимд код засварласны дараа шууд хэрэглэх
→ Дебаг сессийг дахин эхлүүлэхгүйгээр кодын өөрчлөлтийг тест хийх - Thread dump шинжилгээ:
→ Түгжрэлийн төлөв эсвэл гүйцэтгэлийн асуудал шинжлэх
→ Thread.getAllStackTraces() метод ашиглах
Тест болон дебагийн гол цэгүүд
- Системтэй тест: JUnit ашиглан нэгж тест бичих
- Үр дүнтэй дебаг: Зогсоох цэг болон хувьсагч ажиглалтаар асуудал шийдэх
- Лог ашиглах: Зохих лог түвшин болон мессежээр асуудал мөрдөх
- Хэрэгсэл ашиглах: eGovFrame хөгжүүлэлтийн хэрэгслийн дэвшилтэт функц ашиглах
- Тасралтгүй сайжруулах: Дебаг туршлагаар кодын чанарыг сайжруулах