Django 테스트 드라이버에서 직접 사용자 지정 Django manage.py 명령을 호출하는 방법
Django 테스트 드라이버에서 직접 사용자 지정 Django manage.py 명령을 호출하는 방법
call_command() 사용
django.core.management
모듈에서 제공하는 call_command()
함수를 사용하여 사용자 지정 명령을 직접 호출할 수 있습니다. 이 함수는 다음과 같은 인수를 받습니다.
- command_name: 실행할 명령 이름 (예:
my_custom_command
) - *args: 명령에 전달할 인수
- **options: 명령에 전달할 옵션
다음은 call_command()
를 사용하여 사용자 지정 명령을 호출하는 예시입니다.
from django.core.management import call_command
# my_custom_command 명령을 'arg1' 및 '--option1' 옵션과 함께 실행합니다.
call_command('my_custom_command', 'arg1', '--option1')
Command 클래스 상속
django.core.management.base
모듈에서 제공하는 Command
클래스를 상속하여 사용자 지정 명령을 정의할 수 있습니다. 이 클래스는 다음과 같은 메서드를 제공합니다.
- handle(): 명령의 실제 동작을 구현하는 메서드
from django.core.management.base import Command
class MyCustomCommand(Command):
help = 'My custom command'
def handle(self, *args, **options):
# 명령의 동작을 구현하는 코드
print('Hello, world!')
# my_custom_command 명령을 등록합니다.
commands = {
'my_custom_command': MyCustomCommand(),
}
이 코드는 my_custom_command
라는 이름의 사용자 지정 명령을 정의합니다. 이 명령은 handle()
메서드를 구현하여 "Hello, world!"라는 문자열을 출력합니다.
테스트 드라이버에서 사용자 지정 명령 호출
위의 두 가지 방법 중 하나를 사용하여 테스트 드라이버에서 사용자 지정 명령을 호출할 수 있습니다.
from django.test import TestCase
class MyCustomCommandTest(TestCase):
def test_my_custom_command(self):
# my_custom_command 명령을 'arg1' 및 '--option1' 옵션과 함께 실행합니다.
call_command('my_custom_command', 'arg1', '--option1')
# 명령이 예상대로 작동했는지 확인하는 테스트 코드
...
from django.test import TestCase
from django.core.management.base import Command
class MyCustomCommand(Command):
help = 'My custom command'
def handle(self, *args, **options):
# 명령의 동작을 구현하는 코드
...
class MyCustomCommandTest(TestCase):
def test_my_custom_command(self):
# my_custom_command 명령을 직접 실행합니다.
command = MyCustomCommand()
command.handle()
# 명령이 예상대로 작동했는지 확인하는 테스트 코드
...
두 가지 방법 모두 테스트 드라이버에서 직접 사용자 지정 Django manage.py
명령을 호출하는 데 유효합니다. 어떤 방법을 사용할지는 개인의 취향과 상황에 따라 다릅니다.
예제 코드
# my_custom_command.py
from django.core.management.base import BaseCommand
class MyCustomCommand(BaseCommand):
help = 'My custom command'
def handle(self, *args, **options):
# 명령의 동작을 구현하는 코드
print('Hello, world!')
# tests/test_my_custom_command.py
from django.test import TestCase
class MyCustomCommandTest(TestCase):
def test_my_custom_command(self):
# my_custom_command 명령을 'arg1' 및 '--option1' 옵션과 함께 실행합니다.
call_command('my_custom_command', 'arg1', '--option1')
# 명령이 예상대로 작동했는지 확인하는 테스트 코드
self.assertEqual(output, 'Hello, world!')
# my_custom_command.py
from django.core.management.base import Command
class MyCustomCommand(Command):
help = 'My custom command'
def handle(self, *args, **options):
# 명령의 동작을 구현하는 코드
print('Hello, world!')
# tests/test_my_custom_command.py
from django.test import TestCase
from my_custom_command import MyCustomCommand
class MyCustomCommandTest(TestCase):
def test_my_custom_command(self):
# my_custom_command 명령을 직접 실행합니다.
command = MyCustomCommand()
command.handle()
# 명령이 예상대로 작동했는지 확인하는 테스트 코드
self.assertEqual(output, 'Hello, world!')
설명:
my_custom_command.py
파일은MyCustomCommand
라는 사용자 지정 명령을 정의합니다.
실행:
my_custom_command.py
파일을 Django 프로젝트의management/commands
디렉토리에 저장합니다.- 다음 명령을 사용하여 테스트를 실행합니다.
python manage.py test tests.test_my_custom_command
결과:
테스트가 성공하면 다음과 같은 출력이 나타납니다.
OK
대체 방법
subprocess 모듈 사용
subprocess
모듈을 사용하여 Python 서브프로세스에서 manage.py
명령을 실행할 수 있습니다. 다음은 subprocess
를 사용하여 my_custom_command
명령을 실행하는 예시입니다.
import subprocess
# my_custom_command 명령을 'arg1' 및 '--option1' 옵션과 함께 실행합니다.
subprocess.run(['manage.py', 'my_custom_command', 'arg1', '--option1'])
shlex 모듈 사용
shlex
모듈을 사용하여 명령 행 문자열을 파싱하고 subprocess
를 사용하여 실행할 수 있습니다. 다음은 shlex
를 사용하여 my_custom_command
명령을 실행하는 예시입니다.
import shlex
# my_custom_command 명령을 'arg1' 및 '--option1' 옵션과 함께 실행합니다.
command = 'manage.py my_custom_command arg1 --option1'
args = shlex.split(command)
subprocess.run(args)
os 모듈 사용
os
모듈을 사용하여 manage.py
명령을 직접 실행할 수 있습니다. 다음은 os
를 사용하여 my_custom_command
명령을 실행하는 예시입니다.
import os
# my_custom_command 명령을 'arg1' 및 '--option1' 옵션과 함께 실행합니다.
command = 'manage.py my_custom_command arg1 --option1'
os.system(command)
주의:
subprocess
,shlex
,os
모듈을 사용하는 방법은call_command()
또는Command
클래스 상속을 사용하는 방법보다 덜 안정적일 수 있습니다.- 이러한 방법은 플랫폼 간 호환성이 없을 수 있습니다.
결론:
Django 테스트 드라이버에서 직접 사용자 지정 Django manage.py
명령을 호출하는 방법은 여러 가지가 있습니다. 상황에 따라 가장 적합한 방법을 선택해야 합니다.
django unit-testing