Appearance
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.