SORU
23 Mart 2011, ÇARŞAMBA


Böyle büyük mükafat 4: komut satırından testleri (xcodebuild) Çalıştırmak?

4, birim testleri dahil iOS Güncellemelerinden yepyeni bir proje oluşturduk. Varsayılan uygulama 2 hedefler, ana uygulama ve birim test paketi var. Kullanarak " ^ Ürün . Test" (Command-U) uygulama oluşturur, kurar, bir birim test paketi, iOS simülatörü başlattı ve testler çalışır. Şimdi komut satırından aynı şeyi yapmak istiyorum. Komut satırı aracı (xcodebuild) yok "test" eylem, ama göründüğü gibi öğrenebilirim yapı birim test paketi hedef doğrudan yana uygulamaya bağlıdır kendisi. Ancak, çalışan:

xcodebuild -target TestAppTests -sdk iphonesimulator4.3 -configuration Debug build

aşağıdaki mesajı verir:

/Developer/Platforms/iPhoneSimulator.platform/Developer/Tools/Tools/RunPlatformUnitTests:95: warning: Skipping tests; the iPhoneSimulator platform does not currently support application-hosted tests (TEST_HOST set).

Bu Test Ana GUI Komut-U çalıştırdığımda birim test paketi hedefim için ayarlanır beri bir yalan gibi görünüyor. Mantık testleri ve uygulama testleri arasındaki ayrımı hakkında önceki mesajları gördüm, ama böyle büyük mükafat 4 Bu ayrım ortadan kalkıyor gibi görünüyor. Komut satırından testleri çalıştırmak için nasıl herhangi bir ipucu?

CEVAP
30 Mayıs 2012, ÇARŞAMBA


ÖNEMLİ NOT

5.1 (belki daha önce böyle büyük mükafat olarak) böyle büyük mükafat test geçerli bir yapı eylemdir.

Tüm aşağıda -destination uygun seçenekler ile test oluştur eylemini kullanarak xcodebuild çağrısı ile ve hack değiştirmek için başardık. Daha fazla bilgi için man xcodebuild.

Aşağıdaki bilgiler buraya gelecek kuşaklar için bıraktı


Belirtildiği gibi Apple senaryolarını birim testleri çalıştırmak için hack çalıştım

Running Xcode 4 unit tests from the command line

ve

Xcode4: Running Application Tests From the Command Line in iOS

web üzerinde çok sayıda benzer kayıtlar.

Ancak, bu çözümlerin bir sorun ile karşılaştım. Bazı birim testleri icra iOS Anahtarlık ve arayan çalışırken çevre gelir hack, Apple'ın komut, başarısız bir hata (errSecNotAvailable[-25291] çok garip). Sonuç olarak, testler her zaman... bir testte istenmeyen bir özellik başarısız oldu.

Web üzerinde başka bir yerde buldum çözümleri bilgilere dayanarak bir dizi denedim. Bu çözümlerin bazı iOS simülatörü güvenlik hizmetleri daemon başlatmak için çalışıyor, örneğin dahil. Bunlarla uğraştıktan sonra, Benim en iyi bahis simülatörü ortamı tam verim ile iOS simülatörü çalıştırmak gibi görünüyordu.

Yaptım, oldu iOS Simülatör aracı fırlatma ulaşmaya çalış o zaman ne 21**. Bu komut satırı aracı, özel Elma çerçeveler komut satırından bir iOS uygulamasını başlatmak için kullanır. Bana özellikle, ancak, bana baåÿlattä uygulaması için Ortam Değişkenleri ve Komut Satırı Argümanları hem geçmesini sağlar aslında.

Ortam değişkenleri rağmen, Birim Test bohçam benim Uygulama içine almak mümkün oldu. Komut satırı argümanları, geçebilir "-SenTest" uygulaması birim testleri çalıştırmak ve çıkmak için almak için gerekli.

Düzeni ben yarattım aradım ("") CommandLineUnitTests birliğim için paket Test ve "eylem mesaj yukarıda açıklandığı gibi bir bölüm oluşturun. Çalışma işaretli

Apple'ın komut kesmek yerine, olsa, uygulama, ios-sım kullanarak başlatır ve çevre ayarlayan bir senaryoyu uygulamaya birim test bohçam ayrı ayrı enjekte etmek için yerini aldı.

Benim komut dosyası BASH betik benim için çok tanıdık olan Ruby ile yazılmış. İşte o senaryo:

if ENV['SL_RUN_UNIT_TESTS'] then
    launcher_path = File.join(ENV['SRCROOT'], "Scripts", "ios-sim")
    test_bundle_path= File.join(ENV['BUILT_PRODUCTS_DIR'], "#{ENV['PRODUCT_NAME']}.#{ENV['WRAPPER_EXTENSION']}")

    environment = {
        'DYLD_INSERT_LIBRARIES' => "/../../Library/PrivateFrameworks/IDEBundleInjection.framework/IDEBundleInjection",
        'XCInjectBundle' => test_bundle_path,
        'XCInjectBundleInto' => ENV["TEST_HOST"]
    }

    environment_args = environment.collect { |key, value| "--setenv #{key}=\"#{value}\""}.join(" ")

    app_test_host = File.dirname(ENV["TEST_HOST"])
    system("#{launcher_path} launch \"#{app_test_host}\" #{environment_args} --args -SenTest All #{test_bundle_path}")
else
    puts "SL_RUN_UNIT_TESTS not set - Did not run unit tests!"
end

Komut satırından çalışan bu gibi görünüyor:

xcodebuild -sdk iphonesimulator -workspace iPhoneApp.xcworkspace/ -scheme "CommandLineUnitTests" clean build SL_RUN_UNIT_TESTS=YES

SL_RUN_UNIT_TESTS ortam değişkeni için baktıktan sonra, senaryoyu "launcher" (iOS-sım çalıştırılabilir) projenin kaynak içinde ağacı. bulur O zaman Birim Test benim Paket Güncellemelerinden ortam değişkenleri geçen oluşturma ayarları temel yolunu oluşturur.

Sonra, birim enjekte çalışan uygulamam için çalışma zamanı Ortam Değişkenleri kümesi, paket test oluşturun. Yukarı yazısının ortası environment karma değişkenleri kurdum ruby grunge ios-sim uygulama için komut satırı argümanları bir dizi içine katılmak için kullanın.

Yakın altına alın TEST_HOST ortamı olarak uygulamasını istiyorum başlatmak ve system komut aslında yürütür ios-sim geçen uygulama, komut bağımsız değişkenleri ayarlamak için çevre ve argümanlar -SenTest All ve test paket yolu çalışan uygulama.

Bu planın avantajı Güncellemelerinden kendisi inandığım kadar simülatör ortamında birim testleri çalıştırır. Düzeni aleyhine uygulamayı başlatmak için harici bir araç kullanır. Harici araç özel Apple çerçeveler kullanır, sonraki işletim sistemi sürümleri ile kırılgan olabilir, ama şu an için çalışıyor.

P. S. ben" anlatı sebep, ama övgü bir sürü için bu yazı bana çok şey ile bu problem ile çalışan suç, Pawel, benim de ortak gider "kullandım

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alex maybury

    alex maybury

    20 Aralık 2007
  • spederson7

    spederson7

    17 Temmuz 2006
  • talkandroid

    talkandroid

    27 Mayıs 2010