본 프로젝트는 2그룹 자동수정 프레임워크를 구현하는 것을 목표로 한다. 2그룹 자동수정 프레임워크는 오류가 있는 파이썬 프로젝트를 입력으로 받아 수정해 모든 테스트가 양성 테스트가 되도록 수정된 소스코드 집합(패치)의 후보를 출력한다.
구체적으로 입력으로 받는 파이썬 프로젝트는 다음의 요소들을 반드시 포함해야 한다:
- 여러개의 파이썬 파일을 포함한 소스 디렉토리.
- pytest 라이브러리로 실행할 수 있는 유닛 테스트의 디렉토리. 한개 이상의 음성 테스트를 반드시 포함.
- 의존성 정보 (e.g., requirements.txt)
본 프레임워크는 다음의 세가지 모듈로 구성된다:
- 오류 위치 추정기 (Fault Localization)
- 패치 생성기 (Patch Generator)
- 패치 검증기 (Patch Validator)
본 프레임워크 설치 및 실행은 Ubuntu 22.04 환경에서 테스트 되었으며, Python>=3.9 이상을 요구한다.
- 현재 프레임워크는 파이썬 타입오류(TypeError)만을 지원합니다.
본 프레임워크를 실행하기 위해 Docker를 사용하는 것을 권장한다. Local 환경에서 설치하는 방법은 Local 설치 가이드로 넘어가면 된다.
먼저, 해당 프로젝트를 클론한다:
git clone https://github.com/kupl/erc-group2-framework.git
다음으로, Docker 이미지를 빌드한다:
cd erc-group2-framework
docker build -t erc-framework dockerfile
빌드가 완료되면, 다음 명령어를 이용하여 Docker 컨테이너를 실행한다:
docker run -it erc-framework
먼저, 해당 프로젝트를 클론하고 필요한 패키지들을 설치한다:
git clone https://github.com/kupl/erc-group2-framework.git
cd erc-group2-framework
pip install -r requirements.txt
다음으로, 본 프레임워크를 위해 수정된 버전의 pyannotate 라이브러리를 설치한다.
pip install --use-pep517 -e pyannotate
본 프레임워크를 테스트하기 위해 example/sample
디렉토리에 있는 예제 프로젝트를 사용할 수 있다. 다음과 같은 명령어를 통해 해당 예제를 실행할 수 있다:
python run.py \
--source-directory example/sample/src \
--config test_info/sample.json
위의 명령어를 통해 메인 프레임워크가 실행되며, 세 가지 모듈 (오류 위치 추정기, 패치 생성기, 패치 검증기)가 실행된다. 모든 모듈이 성공적으로 실행되면, test_info/sample
디렉토리에 결과물이 저장된다. 패치 검증까지 성공한 파일들은 test_info/sample/validated_patches
에 저장된다.
본 프레임워크는 다음과 같은 명령어를 통해 실행된다:
python run.py \
--source-directory [source_directory] \
--config [config_directory]
위의 명령어는 다음과 같은 옵션을 포함한다:
-s
,--source-directory
: 소스 디렉토리의 경로-c
,--config
: 설정 파일의 경로
소스 디렉토리는 프로젝트의 메인 소스코드가 포함된 디렉토리를 가리킨다. 설정 파일은 Config 파일 구조에 따라 작성되어야 한다.
메인 프레임워크 실행 시, 오류 위치 추정기, 패치 생성기, 패치 검증기가 차례로 실행된다.
해당 결과물은 test_info/<project name>
디렉토리에 저장된다.
본 프레임워크의 각 모듈은 다음과 같은 명령어를 통해 개별적으로 실행할 수 있다. 모듈 별 실행 전 테스트를 실행하여 결과물을 생성해야 한다. 테스트 실행은 다음과 같은 명령어를 통해 실행된다:
python run_test.py --config [config_directory]
결과물은 ``<config 경로의 상위 폴더>` 디렉토리에 저장된다.
- 오류 위치 추정기 실행:
테스트 실행 결과물을 이용하여 오류 위치 추정기를 실행하는 명령어는 다음과 같다:
python run_fault_localize.py \
--config [config_directory]
결과물은 <config 경로의 상위 폴더>/fl_output
디렉토리에 저장된다.
- 패치 생성기 실행:
오류 위치 추정기 결과물을 이용하여 패치 생성기를 실행하는 명령어는 다음과 같다:
python run_patch_generator.py \
--source-directory [source_directory] \
--config [config_directory]
결과물은 <config 경로의 상위 폴더>/generated_patches
디렉토리에 저장된다.
- 패치 검증기 실행:
패치 생성기 결과물을 이용하여 패치 검증기를 실행하는 명령어는 다음과 같다:
python run_patch_validator.py \
--source-directory [source_directory] \
--config [config_directory]
결과물은 <config 경로의 상위 폴더>/validated_patches
디렉토리에 저장된다.
본 프레임워크는 다음과 같은 구조의 설정 파일을 사용한다:
{
"name": <Project Name>
"pos" : [
"--continue-on-collection-errors",
"--execution-timeout", "300",
<Positive Test Case Directories>
],
"neg" : [
"--continue-on-collection-errors",
"--execution-timeout", "300",
<Negative Test Case Directories>
]
}
Test Case 디렉토리 설정은 pytest command line option을 따른다.
본 가이드에서는 자주 사용되는 몇 가지 옵션을 설명한다.
-
<test-file-directory>
: 특정 테스트 파일을 테스트한다. 예를 들어,example/sample/test/source_test.py
는example/sample/src/source_test.py
파일의 전체 메소드를 테스트하는 것이다. -
<test-file-directory>::<test-method-name>
: 특정 테스트 파일의 특정 메소드만을 테스트한다. 예를 들어,example/sample/test/source_test.py::test_progbar_neg1
는example/sample/src/source_test.py
파일의test_progbar_neg1
메소드만을 테스트하는 것이다. -
-k <EXPRESSION>
: 특정 표현식을 포함하는 테스트만을 실행한다. 예를 들어,-k "not neg"
는neg
이라는 표현식을 포함하지 않는 테스트만을 실행하는 것이다.
이러한 옵션을 통해 예제로 제공된 example/sample
프로젝트의 설정 파일은 다음과 같다:
{
"name": "sample",
"pos" : [
"--continue-on-collection-errors",
"--execution-timeout", "300",
"-k", "not neg",
"example/sample/test/source_test.py"
],
"neg" : [
"--continue-on-collection-errors",
"--execution-timeout", "300",
"example/sample/test/source_test.py::test_progbar_neg1",
"example/sample/test/source_test.py::test_progbar_neg2"
]
}
Positive 테스트 케이스는 example/sample/test/source_test.py
파일의 테스트 메소드 중 neg
가 포함되지 않은 모든 테스트를 실행하고,
Negative 테스트 케이스는 example/sample/test/source_test.py
파일의 test_progbar_neg1
과 test_progbar_neg2
메소드만을 실행한다.