당신이에 대한 액세스 권한을 가진 보장 할 수 있다면 ...
import sys
from functools import partial
def trace_calls(call_list, frame, event, arg):
if event != 'call':
return
call_list.append(frame.f_code)
def test_call(caller, called):
traces = []
old = sys.gettrace()
sys.settrace(partial(trace_calls, traces))
try:
caller()
finally:
sys.settrace(old)
try:
idx = traces.index(called.func_code)
except ValueError:
return False
if idx and traces[idx-1] == caller.func_code:
return True
return False
그리고 테스트 : 광산은 단순한 기능이지만, 대상 기능의 직접 실행 호출자의 소스 기능이 있다면 그것은 확인 통화 이름으로 항상 것을
가
import ast
call_names = [c.func.id for c in ast.walk(ast.parse(inspect.getsource(source)))
if isinstance(c, ast.Call)]
return 'target' in call_names
주, 그래서 전화가 특정 (SECURITY) 기능을 비활성화하는 것입니다 여부를 알 어려운 (잠재적으로 불가능)입니다 : 소스 코드, 당신은 ast.parse
을 사용할 수 있습니다 이온 또는 다른 동일한 이름의. 소스 코드가없는
는 유일한 방법은 분해 경유 :
import dis
def ops(code):
i, n = 0, len(code)
while i < n:
op = ord(code[i])
i += 1
if op == dis.EXTENDED_ARG:
ext = ord(code[i]) + ord(code[i+1])*256
op = ord(code[i + 2])
i += 3
else:
ext = 0
if op >= dis.HAVE_ARGUMENT:
arg = ord(code[i]) + ord(code[i+1])*256 + ext*65536
i += 2
yield op, arg
else:
yield op, None
source_ops = list(ops(source.func_code.co_code))
문제는 함수가 가 다른 기능을 호출하거나 참조를로드 여부를 알려 실제로는 불가능이다 그것; 다른 함수가 map
또는 reduce
등으로 전달되면 호출되지만 다른 함수로 전달 될 수 있습니다. 실질적으로 분별 것은 함수가 source.func_code.co_names
에있는 경우 다음 호출 할 수 있다고 가정하는 것입니다
는
'target' in source.func_code.co_names
어떻게 단위 테스트이 관련이 당신에게 도움이 될 것입니다? 단위 테스트는 사양을 준수하여 동작을 결정하는 것입니다. – Marcin
@Marcin 이렇게하면 test_check에 check()을 호출해야한다는 사양을 준수하는지 확인합니다. – devtk
@devtk, 이것은 단위 코드 테스트가 아닌 코드 커버리지 분석에 가장 적합합니다. 유닛 테스트는'test_check()'가'check()'를 호출하는지 상관하지 않습니다. 'test_check()'의 반환 값과 부작용 만 다루고 있습니다. –