2012-05-18 14 views
7

Tek bir birim testi çalıştırmak ve "profil oluşturma" bilgilerini toplamak istiyorum: her yöntemin ne sıklıkta çağrıldığı, belirli sınıfın kaç örneğinin oluşturulduğu, ne kadar zaman yapıldığı Belirli bir yöntemi/iş parçacığı vb. yürütmek için kullanın. Sonra, bu bilgileri beklenen bazı değerler ile karşılaştırmak istiyorum. Java için herhangi bir Profil Oluşturucusu var mıyım, bunu yapmama izin verin (tüm bunlar, GUI veya kullanıcı etkileşimi olmadan, otomatik olarak yapılmalıdır, elbette)?Tek bir birim testi için Java profil oluşturma sonuçlarını otomatik olarak karşılaştırma

Bu ben çalışmak istiyorum nasıl: bilgileri otomatik profil anlık yakalama

public class MyTest { 
    @Test 
    public void justTwoCallsToFoo() { 
    Profiler.start(Foo.class); 
    Foo foo = new Foo(); 
    foo.someMethodToProfile(); // profiler should collect data here 
    assertThat(
     Profiler.getTotalCallsMadeTo(Foo.class, "barMethod"), 
     equalTo(3) 
    ); 
    } 
} 
+0

Bu soru, diğerlerinden farklı bir şekilde nasıl bir Java uzmanı önerebilir? SO ile ilgili sorularınız mı var? YourKit'i Intellij ile kullanıyorum ve sadece (bireysel) birim testlerini başka bir koşula göre ... – amaidment

+1

Herhangi bir IDE olmadan veya profil oluşturucularla herhangi bir görsel etkileşim olmaksızın bir sınıf/yöntem ** içeri ** bir ünite testi yapmak istiyorum. – yegor256

+0

Birim testinizin profilleyiciyi yürüteceğini, çıktıyı toplayacağını ve birim testinin profil verisine göre (örneğin, bir yöntemin kaç kez çağrıldığı) geçeceğini/başarısız olacağını söylemek ister misiniz? Eğer öyleyse o zaman bir profiler * programlı olarak * çağırmak ve çıktılarını bir API ile almak istediğinizi açıklığa kavuşturmak için sorunun açıklığa kavuşacağına inanıyorum. Örneğin, siz insan olarak yaptığım gibi "karşılaştırmak istiyorum" ifadesini manuel olarak yapıyorum. –

cevap

1

Bunun bir J2SE yerleşik HPROF profiling tool ile yapılabileceğini öğrendim.

java -agentlib:hprof=cpu=times MyTest 

Böyle biçimlendirilmiş bir metin dosyası üretir:

CPU SAMPLES BEGIN (total = 126) Fri Oct 22 12:12:14 2004 
rank self accum count trace method 
    1 53.17% 53.17%  67 300027 java.util.zip.ZipFile.getEntry 
    2 17.46% 70.63%  22 300135 java.util.zip.ZipFile.getNextEntry 
    3 5.56% 76.19%  7 300111 java.lang.ClassLoader.defineClass2 
    4 3.97% 80.16%  5 300140 java.io.UnixFileSystem.list 
    5 2.38% 82.54%  3 300149 java.lang.Shutdown.halt0 
.... 

Sonra ilgilendiğiniz yöntemleri dosyasını ayrıştırmak ve ayıklamak için kolay çözüm tamamen ücretsizdir ve JSE yerleşik. Bu, diğer araçlarla karşılaştırıldığında büyük bir avantajdır.

+0

Şimdi sağladığınız bağlantıyı, ana sayfanıza yönlendiriyormuş gibi görünüyorsanız ... http://docs.oracle.com/javase/7/docs/technotes/ adresinden güncelleyebilirsiniz. örnekler/hprof.htmlm – evandor

3

birkaç Java profilers ile mümkündür, sen gelmiş profiler yüklemek için Java başlangıç ​​komutuna VM parametrelerini eklemek ve profiler'e veri kaydetmesini ve çıkışta bir anlık görüntü kaydetmesini söylemeliyim.

JProfiler'da bunu yapmak için "profile" ant task kullanabilirsiniz. Profil ayarlarını JProfiler GUI'den verilen bir yapılandırma dosyasından alır. Kaydı başlatmak ve bir anlık görüntü kaydetmek için Controller API'u kullanabilirsiniz.

  1. Sen bilinen bir başlangıca karşı anlık karşılaştırma jpcompare komut satırı yardımcı programını veya tekabül "compare" ant task kullanabilirsiniz:

    Sonra iki seçenek var. several comparisons available vardır. Sonuçları HTML olarak veya makine tarafından okunabilir bir biçimde (CSV/XML) dışa aktarabilirsiniz.

  2. için jpexport komut satırı yardımcı veya karşılık gelen "export" ant task ile anlık veri ayıklamak. Daha sonra, belirli bir çalışmadan profil verilerini analiz etmek için kendi kodunuzu yazabilirsiniz. veri profilleme sınırlı sayıda için

, örnekte olduğu Profiler.getTotalCallsMadeTo(Foo.class, "barMethod") böyle bir şey yapar kendi profiler yazmak için JProfiler API kullanmayı aslında mümkündür. JPofiler yüklemesinde api/samples/platform örneğine bakın. Bilgiyi sıcak nokta verilerinden alırsınız. Bununla birlikte, belirli bir yöntemin aranıp uygulanmadığına dair iddialarda bulunmak için AOP-temelli bir yaklaşım benimsemeyi önerebilirim. Performans regresyonlarını saptamak için profiler tabanlı bir yaklaşım kullanmak uygundur.

Yasal Uyarı: Şirketim JProfiler geliştirir.

+0

Bir çözüm gibi geliyor, teşekkürler. Btw, Maven eklentiniz var mı? – yegor256

+0

Hayır, henüz bir maven eklentisi yok. –

+0

10 Başka bir dezavantaj, ücretsiz bir ürün olmamasıdır. – yegor256