앱 소스는 언제 테스트 대상에 포함되어야합니까?
새 프로젝트에서는이 간단한 테스트가 있습니다.
#import <XCTest/XCTest.h>
#import "ViewController.h"
@interface ViewControllerTests : XCTestCase
@end
@implementation ViewControllerTests
- (void)testExample
{
// Using a class that is not in the test target.
ViewController * viewController = [[ViewController alloc] init];
XCTAssertNotNil(viewController, @"");
}
@end
ViewController.h는 테스트 대상의 일부 가 아니지만 문제없이 테스트를 컴파일하고 실행합니다.
응용 프로그램이 먼저 (종속성) 빌드되고 테스트가 빌드되기 때문이라고 생각합니다. 링커는 ViewController 클래스가 무엇인지 파악합니다.
그러나 정확히 동일한 테스트 및 ViewController 파일을 사용하는 이전 프로젝트에서는 링커 단계에서 빌드가 실패합니다.
Undefined symbols for architecture i386: "_OBJC_CLASS_$_ViewController", referenced from: objc-class-ref in ViewControllerTests.o
이 링커 오류는 새로운 XCTest 단위 테스트 대상이 생성 된 경우에도 발생합니다.
대신이 문제를 해결하기 위해 앱과 테스트 대상 모두에 소스를 포함 할 수 있습니다 (위 이미지에서 두 상자를 모두 선택). 이로 인해 시뮬레이터의 시스템 로그에서 중복 기호에 대한 빌드 경고가 발생합니다 (시뮬레이터를 열고 cmd- /를 눌러 확인).
Class ViewController is implemented in both [...]/iPhone Simulator/ [...] /MyApp.app/MyApp and [...]/Debug-iphonesimulator/LogicTests.octest/LogicTests. One of the two will be used. Which one is undefined.
이러한 경고로 인해 다음 예와 같은 문제가 발생하는 경우가 있습니다.
[viewController isKindOfClass:[ViewController class]]; // = NO
// Memory address of the `Class` objects are different.
NSString * instanceClassString = NSStringFromClass([viewController class]);
NSString * classString = NSStringFromClass([ViewController class]);
[instanceClassString isEqualToString:classString]; // = YES
// The actual class names are identical
그래서 질문은 이전 프로젝트의 어떤 설정이 애플리케이션 소스 파일을 테스트 대상에 포함해야 하는가입니다.
의견 요약
작동중인 프로젝트와 작동하지 않는 프로젝트 사이 :
- 링커 출력에는 차이가 없습니다 (으로 시작하는 명령
Ld
). - 대상 의존성에는 차이가 없습니다 (앱인 테스트 대상에 1 개의 의존성이 있음)
- 링커 설정에는 차이가 없습니다.
나는 이것을 알아내는 데 시간을 보냈다.
이 문서 를 읽으면 Xcode에 테스트 실행을위한 두 가지 모드가 있음을 알 수 있습니다. 논리 테스트 및 애플리케이션 테스트. 차이점은 로직 테스트는 클래스와 심볼이 내장 된 자체 타겟을 빌드한다는 것입니다. 결과 실행 파일은 시뮬레이터에서 실행될 수 있으며 테스트 출력을 Xcode에 다시보고합니다. 반면에 애플리케이션 테스트는 런타임에 앱에 삽입되는 코드에 연결되는 동적 라이브러리를 빌드합니다. 이를 통해 iPhone 환경에서 테스트를 실행하고 Xib 로딩 및 기타 사항을 테스트 할 수 있습니다.
소스 파일의 연결을 해제 할 때 테스트 대상에서 기호가 누락 되었기 때문에 이전 프로젝트에 애플리케이션 (단위) 테스트가 아닌 논리 테스트 용으로 구성된 테스트 대상이있는 것처럼 보입니다.
요즘 Xcode 는 두 가지를 구별하지 않으려 고 애쓰는 것처럼 보이며 애플리케이션 테스트 대상을 만드는 데 기본값을 사용하면 논리 테스트 대상을 단위 테스트 대상으로 바꾸기 위해 변경해야 할 모든 것을 살펴볼 수 있습니다.
또한 방향이 약간 다를 수 있으므로 정적 라이브러리 대상이 아닌 응용 프로그램 대상이 있다고 가정합니다.
- 테스트 대상의 빌드 설정에서 "Bundle Loader"및 "Test Host"빌드 설정을 삭제합니다. 나중에 다시 추가하기 위해 Xcode를 얻을 것입니다.
- 테스트 대상에서 애플리케이션의 모든 .m 파일을 제거해야합니다. 모든 .m 파일을 선택하고 Xcode 파일 검사기에서 테스트 대상을 제거하여이를 수행하거나 테스트 대상의 컴파일 소스 빌드 단계를 사용할 수 있습니다.
- 테스트 대상의 "프레임 워크 검색 경로"를 변경하십시오. Xcode 5의 경우
$(SDKROOT)/Developer/Library/Frameworks $(inherited) $(DEVELOPER_FRAMEWORKS_DIR)
순서 가 있어야하며 추가 따옴표 나 백 슬래시가 없어야합니다. - 테스트 대상 빌드 설정의 일반 창으로 이동하고 드롭 다운 메뉴에서 대상을 선택합니다. 메뉴에 이미 애플리케이션 대상이 지정되어있는 경우이를 껐다가 다시 켜야합니다. 그러면 Xcode가 번들 로더 및 테스트 호스트 설정을 올바른 값으로 재구성합니다.
- 마지막으로 응용 프로그램의 구성표를 다시 확인하십시오. 구성표 드롭 다운에서 구성표 편집을 선택합니다. 그런 다음 테스트 조치를 클릭하십시오. 테스트 대상이 정보 창의 목록에 있는지 확인하고 모든 테스트가 선택되었는지 확인합니다.
이 정보는 위의 링크 된 문서에서 가져온 것이지만 Xcode 5의 단계를 업데이트했습니다.
편집하다:
흠 100 % eph515가 디버그 기호가 표시되는 것에 대해 말하는 것에 주목하지만 누군가가 Release
또는 다른 구성 에서 빌드하도록 스키마의 테스트 작업을 설정하지 않았는지 확인하고 싶을 수도 있습니다 . 구성표 선택기를 클릭하고 편집 구성표를 선택합니다. 테스트 작업을 클릭 한 다음 빌드 구성이Debug
정적 라이브러리 대상이있는 경우
따라서 정적 라이브러리 대상이있는 경우 두 가지 옵션이 있습니다. 1. 논리 테스트 2. 호스트 앱의 애플리케이션 테스트
1. 의 경우 정적 라이브러리 대상에 대해 Bundle Loader
및 Test Host
이 비어 있는지 확인해야합니다 . 그런 다음 소스를 실행할 다른 방법이 없으므로 테스트 대상으로 컴파일해야합니다.
2. Xcode에서 새 앱 프로젝트를 만들고 정적 라이브러리 프로젝트를 하위 프로젝트로 추가해야합니다. 그런 다음 새 앱의 테스트 대상에서 Static Lib 테스트 대상으로 설정 을 수동으로 복사 Bundle Loader
하고 Test Host
빌드해야합니다. 그런 다음 새 테스트 앱의 체계를 열고 새 앱의 테스트 작업에 테스트 대상을 추가합니다. lib에서 테스트를 실행하려면 호스트 앱에 대한 테스트 작업을 실행합니다.
Xcode 6에서는 테스트 대상> 일반> 테스트에서 "호스트 애플리케이션 API 테스트 허용"을 선택하여이 문제를 해결할 수있었습니다.
나는 이것도 만났고 jackslash의 권장 사항을 따랐지만 한 가지 더 추가했습니다. 주 대상을 선택하고 기본값으로 숨겨진 기호 (Apple LVM 5.0-코드 생성 아래)를 찾으십시오. 값이 예이면 아니오로 변경하십시오. 단위 테스트 대상이 찾고있는 컴파일 된 소스의 모든 기호를 '숨기기 해제'합니다. 나를 위해 작동합니다. 잭 슬래시에서 설명한 모든 단계를 포함했는지 확인하세요.
대답은 jackslash와 eph515의 대답의 조합이었습니다.
eph515에서와 마찬가지로 symbols hidden by default
디버그의 경우 No가되어야합니다.
또한 deployment postprocessing
디버그 없음을해야합니다.
또한 테스트 대상에 포함 된 모든 라이브러리를 단위 테스트에서 제거해야합니다. 남은 것은 스크린 샷의 3과 유닛 테스트에 관련된 모든 것입니다.
Also if there is a run build script build phase at the end of the list, then it should be removed (since it is an artefact of unit testing).
Then do everything in jackslash's answer.
In my case in Xcode 6.2 was error in different architectures in project target and tests target.
Project target has only armv7 and armv7s architectures (because of some older library)
Project Tests target has armv7, armv7s and arm64 architectures.
Removing arm64 architecture solve this issue for my case.
Project Editor -> Project Tests target -> Build Settings -> Valid Architectures = armv7 armv7s
(perhaps it is needed also to set "Architectures" instead of $(ARCHS_STANDARD) to $(ARCHS_STANDARD_32_BIT))
For me it was just a case of having no test targets added for the Scheme.
For the app target go to Edit Scheme, then click Test on the right hand side then add a test target with the + button at the bottom:
참고 URL : https://stackoverflow.com/questions/21911168/when-do-app-sources-need-to-be-included-in-test-targets
'Nice programing' 카테고리의 다른 글
cron없이 AWS에서 예약 된 작업 실행 (0) | 2020.11.08 |
---|---|
typescript의 module.exports (0) | 2020.11.08 |
role = form은 접근성에 어떤 도움이됩니까? (0) | 2020.11.08 |
Chrome DevTools에서 소스 맵 비활성화 (0) | 2020.11.08 |
Pandas 'Freq'태그에 대한 문서는 어디에 있습니까? (0) | 2020.11.08 |