🏛️ HONGIKINGAN CMS хөгжүүлэгчийн гарын авлага

Хувилбар 202506 | Шинэчилсэн 2025-06-12
🌐 Хэл сонгох: 🇰🇷 한국어 🇲🇳 Монгол 🇺🇸 English

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) тохируулах болон удирдах

Зогсоох цэг тохируулах арга

Зогсоох цэгийн төрөл

🎯Зогсоох цэгийн төрөл

  • Мөрийн зогсоох цэг: Тодорхой мөр дээр гүйцэтгэлийг зогсоох
  • Нөхцөлт зогсоох цэг: Тодорхой нөхцөл хангагдах үед л гүйцэтгэлийг зогсоох
    → Зогсоох цэг дээр баруун товшилт > Breakpoint Properties > нөхцөл оруулах
  • Онцгой байдлын зогсоох цэг: Тодорхой онцгой байдал үүсэх үед гүйцэтгэлийг зогсоох
    → Run > Add Java Exception Breakpoint сонгох

Зогсоох цэг удирдах

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 харагдац ашиглах

Stack trace шинжилгээний арга

📋 Stack trace шалгах

Онцгой байдал үүсэх үед консол харагдац дээр гарсан stack trace шалгах

🔍 Кодын хэсэг олох

Stack trace дээрээс өөрийн кодын хэсгийг олох

🐛 Асуудал тодорхойлох

Тухайн мөр рүү шилжиж асуудлын шалтгааныг тодорхойлох

9.4 Логлох болон лог шинжилгээ

9.4.1 eGovFrame логлох тохиргоо

eGovFrame нь Log4j ашиглан логлохыг хэрэгжүүлдэг.

log4j.xml тохиргооны жишээ
<?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 хөгжүүлэлтийн хэрэгслийн дэвшилтэт функц ашиглах
  • Тасралтгүй сайжруулах: Дебаг туршлагаар кодын чанарыг сайжруулах