Skip to content
On this page

Test Prof

O test prof é uma gem que permite a análise da performance dos testes da aplicação. Ele dispõe de diversas ferramentas que permitem que essa análise seja feita, as quais são descritas nesse artigo. Nessa documentação, serão mostrados alguns dos principais comandos da gem.

Para ter uma noção maior de quais tipos de teste estão tomando mais tempo para rodar, rode o comando TAG_PROF=type rspec. A saída deve conter algo assim:

[TEST PROF INFO] TagProf enabled (type)

           type          time   total  %total   %time           avg

        request     00:18.527     252   27.33   36.17     00:00.073
          model     00:16.900     448   48.59   32.99     00:00.037
    __unknown__     00:08.646      97   10.52   16.88     00:00.089
         helper     00:06.060      70    7.59   11.83     00:00.086
 view_component     00:00.478      50    5.42    0.93     00:00.009
         mailer     00:00.440       2    0.22    0.86     00:00.220
         worker     00:00.175       3    0.33    0.34     00:00.058


Finished in 51.42 seconds (files took 12.57 seconds to load)
922 examples, 0 failures    

O factory doctor informa se há testes que estão criando dados no bd desnecessariamente, para testá-lo, basta rodar FDOC=1 rspec. Geralmente para resolver os problemas acusados aqui, basta encontrar o teste em que o problema está aparencendo e trocar o create por um build. Se der tudo certo, a saída irá conter algo assim [TEST PROF INFO] FactoryDoctor says: "Looks good to me!"

Uma das principais causas de demora nos testes, são as cascatas das factories, por isso recomendo dar uma olhada esse outro artigo feito especificamente para lidar com esse problema. Para constatar que isso é realmente um problema para seus testes, rode o comando EVENT_PROF="factory.create" rspec e verifique a saída, que deverá ser algo assim:

[TEST PROF INFO] EventProf results for factory.create

Total time: 00:32.380 of 00:50.247 (64.44%)
Total events: 2994

Top 5 slowest suites (by time):

ApplicationHelper (./spec/helpers/application_helper_spec.rb:3) – 00:05.684 (298 / 68) of 00:06.082 (93.45%)
User (./spec/models/user_spec.rb:3) – 00:02.211 (142 / 40) of 00:02.477 (89.26%)
List::SchoolClasses (./spec/services/list/school_classes_spec.rb:3) – 00:01.860 (67 / 13) of 00:01.899 (97.95%)
List::Library::Collections (./spec/services/list/library/collections_spec.rb:5) – 00:01.412 (102 / 13) of 00:01.480 (95.41%)
VirtualClassroom (./spec/models/virtual_classroom_spec.rb:3) – 00:01.278 (222 / 31) of 00:02.388 (53.54%)

Note que mais de 60% do tempo gasto para rodar os testes foi gasto nas factories, então certamente há espaço para otimizações!

Além disso, também é possível verificar quais factories estão sendo mais utilizadas rodando o comando FPROF=1 rspec, cuja saída será algo assim, que mostra o total de vezes que uma factorie foi chamada e quantas dessas vezes ela foi explicitamente chamada:

[TEST PROF INFO] Factories usage

 Total: 6810
 Total top-level: 2994
 Total time: 00:31.587 (out of 00:53.228)
 Total uniq factories: 58

   total   top-level     total time      time per call      top-level time               name

     650         338        1.4453s            0.0022s             0.7415s role_company_manager
     593         321        1.2724s            0.0021s             0.6695s role_county_supervisor
     546         280        1.1768s            0.0022s             0.5871s role_school_manager
     465           5        3.6410s            0.0078s             0.0441s user_company_manager
     460           5        4.3924s            0.0095s             0.0530s    company_manager
     455          26        5.6306s            0.0124s             0.3096s            company
     362         251        0.7633s            0.0021s             0.5309s       role_teacher
     357           2        0.5324s            0.0015s             0.0028s               tier
     355         147        9.5295s            0.0268s             3.9182s             county
     336         217       13.8635s            0.0413s             7.9508s             school
     293         203        0.4508s            0.0015s             0.3104s     school_subject
     283         233        1.9120s            0.0068s             1.5669s         user_admin
     255         146        0.5970s            0.0023s             0.3323s       role_student
     200         118        6.5738s            0.0329s             2.1655s       school_class
     117         105        2.5206s            0.0215s             2.1557s            student
     117           6        1.0358s            0.0089s             0.0496s       user_student
     104          61        0.2207s            0.0021s             0.1295s        role_parent
      96           8        0.6551s            0.0068s             0.0816s               user
      74          15        0.5692s            0.0077s             0.1195s       user_teacher
      73          40        4.9212s            0.0674s             2.6786s  virtual_classroom
      63          30        0.5257s            0.0083s             0.2498s               exam
      63          63        0.6836s            0.0109s             0.6836s            teacher
      46          34        2.0751s            0.0451s             1.1315s     scheduled_exam
      44          41        0.5486s            0.0125s             0.5088s library_collection
      44          44        0.6138s            0.0140s             0.6138s      library_media
      43          43        0.5004s            0.0116s             0.5004s             parent
      43           0        0.3543s            0.0082s             0.0000s        user_parent
      41          17        0.3356s            0.0082s             0.1834s user_school_manager
      25          25        0.1620s            0.0065s             0.1620s library_collection_permission
      24          24        0.2664s            0.0111s             0.2664s     school_manager
      24          12        0.8807s            0.0367s             0.4498s scheduled_exams_response
      16          11        0.0420s            0.0026s             0.0328s           question
      14           8        0.0248s            0.0018s             0.0151s         text_genre
      14          14        0.0243s            0.0017s             0.0243s                tag
      13          13        0.1390s            0.0107s             0.1390s            ability
      13          13        0.0280s            0.0022s             0.0280s library_year_permissions
      12           2        0.1271s            0.0106s             0.0332s user_county_supervisor
      10          10        0.1620s            0.0162s             0.1620s  county_supervisor
       8           5        0.6159s            0.0770s             0.3701s     classroom_post
       8           8        0.0154s            0.0019s             0.0154s       regular_exam
       6           5        0.0209s            0.0035s             0.0174s          criterium
       5           5        0.0127s            0.0025s             0.0127s     dashboard_info
       5           5        0.0581s            0.0116s             0.0581s      exam_question
       4           4        0.0214s            0.0053s             0.0214s  county_permission
       4           4        0.0314s            0.0078s             0.0314s             ticket
       3           3        0.0072s            0.0024s             0.0072s role_company_assistant
       3           3        0.3085s            0.1028s             0.3085s       second_retry
       3           3        0.1135s            0.0378s             0.1135s      question_repo
       3           3        0.2141s            0.0714s             0.2141s     activity_topic
       3           3        0.2514s            0.0838s             0.2514s  classroom_comment
       3           3        0.4090s            0.1363s             0.4090s discursive_response
       2           2        0.0465s            0.0232s             0.0465s        forum_topic
       2           2        0.0038s            0.0019s             0.0038s library_collection_media
       1           1        0.0052s            0.0052s             0.0052s        alternative
       1           1        0.1093s            0.1093s             0.1093s        first_retry
       1           1        0.0019s            0.0019s             0.0019s virtual_classroom_teacher
       1           1        0.0036s            0.0036s             0.0036s   question_content
       1           1        0.0060s            0.0060s             0.0060s collection_deny_school

Por fim, também é possível gerar um gráfico interativo que mostra as pilhas de factories que foram chamadas ao longo dos testes. Para gerar o gráfico, basta rodar o comando FPROF=flamegraph rspec que será retornado o caminho para o gráfico gerado: [TEST PROF INFO] FactoryFlame report generated: tmp/test_prof/factory-flame.html. A ideia é que, quanto mais plano for esse gráfico, menores são as cascatas de factories que estão sendo chamadas, diminuindo a duração dos testes.

Vale ressaltar que essa gem apenas te ajuda a encontrar os problemas de performance nos testes, os quais precisarão ser melhorados manualmente e, para ter mais informações sobre como utilizar essas informações para otimizar os testes, é importante conferir os artigos e a documentação oficial, os quais estão referenciados nessa docs.