Skip to content

[RUN AS-IF-FOSS] Use parent strategy for associations in factories

Peter Leitzen requested to merge pl-spec-factory-bot-parent-strategy into master

What does this MR do?

This MR lets FactoryBot's associations to use the same build strategy for their parent object.

This potentially saves SQL queries when using build(...).

Example spec/models/project_spec.rb

Queries saved: 1248

Before

Total time: 01:51.476 of 04:32.996 (40.83%)
Total events: 76360

Top 5 slowest suites (by time):

Project (./spec/models/project_spec.rb:5) – 01:51.476 (76360 / 1015) of 04:32.996 (40.83%)



Finished in 4 minutes 40 seconds (files took 2.49 seconds to load)
1015 examples, 0 failures

[TEST PROF INFO] Factories usage

 Total: 2528
 Total top-level: 1587
 Total time: 176.6419s
 Total uniq factories: 67

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

     760         724      139.4697s            0.1835s           132.4266s            project
     670          92       30.1227s            0.0450s             4.1564s          namespace
     474         266       22.9360s            0.0484s            12.4376s               user
     131         127        4.0226s            0.0307s             3.8843s              group
      56           0        0.8467s            0.0151s             0.0000s    ci_job_artifact
      43          42        1.1256s            0.0262s             1.0862s        ci_pipeline
      29          28        1.8591s            0.0641s             1.8290s           ci_build
      27          27        0.2849s            0.0106s             0.2849s        ci_variable
      27          27        3.3212s            0.1230s             3.3212s      merge_request
      16          16        0.1223s            0.0076s             0.1223s         lfs_object
      16          16        0.5053s            0.0316s             0.5053s     note_on_commit
      15          15        3.1873s            0.2125s             3.1873s     project_member
      14          10        1.2857s            0.0918s             1.0461s            cluster
      13          13        0.3592s            0.0276s             0.3592s          ci_runner
      12          12        0.0854s            0.0071s             0.0854s lfs_objects_project
      12          12        0.4965s            0.0414s             0.4965s              issue
      11           0        0.2767s            0.0252s             0.0000s       package_file
      11          10        0.3746s            0.0341s             0.1429s        environment
      10           0        0.1617s            0.0162s             0.0000s conan_package_file
      10           0        0.0536s            0.0054s             0.0000s conan_file_metadatum
       9           9        0.1130s            0.0126s             0.1130s  ci_empty_pipeline
       9           3        1.8141s            0.2016s             0.7068s              label
       9           9        0.0985s            0.0109s             0.0985s project_auto_devops
       8           8        0.0449s            0.0056s             0.0449s             upload
       8           8        0.4664s            0.0583s             0.4664s project_export_job
       7           7        0.1490s            0.0213s             0.1490s       deploy_token
       6           6        1.1545s            0.1924s             1.1545s  jira_import_state
       6           6        0.1285s            0.0214s             0.1285s   protected_branch
       6           6        0.1466s            0.0244s             0.1466s prometheus_service
       5           5        0.1456s            0.0291s             0.1456s            service
       5           5        0.0353s            0.0071s             0.0353s       import_state
       5           5        0.0837s            0.0167s             0.0837s        group_badge
       5           5        0.3230s            0.0646s             0.3230s          chat_name
       4           0        0.1350s            0.0338s             0.0000s issue_tracker_data
       4           4        0.0356s            0.0089s             0.0356s project_repository
       4           4        0.0143s            0.0036s             0.0143s              shard
       4           4        0.3025s            0.0756s             0.3025s cluster_platform_kubernetes
       4           4        0.2648s            0.0662s             0.2648s ci_instance_variable
       4           4        0.0353s            0.0088s             0.0353s deploy_keys_project
       4           4        1.4899s            0.3725s             1.4899s       project_hook
       4           4        0.2093s            0.0523s             0.2093s      project_badge
       3           3        1.1529s            0.3843s             1.1529s    redmine_project
       3           0        0.7231s            0.2410s             0.0000s    redmine_service
       3           3        0.0196s            0.0065s             0.0196s service_desk_setting
       3           3        0.3990s            0.1330s             0.3990s         deploy_key
       3           3        0.1648s            0.0549s             0.1648s        npm_package
       2           2        0.5879s            0.2939s             0.5879s      maven_package
       2           0        0.4602s            0.2301s             0.0000s    maven_metadatum
       2           0        0.4430s            0.2215s             0.0000s            package
       2           2        0.0549s            0.0274s             0.0549s        npm_package
       2           2        0.5066s            0.2533s             0.5066s      conan_package
       2           0        0.3285s            0.1643s             0.0000s    conan_metadatum
       2           0        0.3145s            0.1573s             0.0000s      conan_package
       2           2        0.0864s            0.0432s             0.0864s              event
       2           2        0.4551s            0.2276s             0.4551s prometheus_project
       2           2        0.0449s            0.0224s             0.0449s      protected_tag
       2           2        0.2570s            0.1285s             0.2570s project_empty_repo
       2           2        0.0257s            0.0128s             0.0257s        system_hook
       2           2        0.3627s            0.1813s             0.3627s      slack_service
       2           2        0.4686s            0.2343s             0.4686s    pool_repository
       2           2        0.0640s            0.0320s             0.0640s     alerts_service
       1           1        0.0065s            0.0065s             0.0065s            license
       1           1        0.0698s            0.0698s             0.0698s container_expiration_policy
       1           1        0.0127s            0.0127s             0.0127s container_repository
       1           1        0.0637s            0.0637s             0.0637s      lfs_file_lock
       1           1        0.0780s            0.0780s             0.0780s custom_issue_tracker_service
       1           1        0.4425s            0.4425s             0.4425s         deployment

After

Total time: 01:35.251 of 03:56.954 (40.2%)
Total events: 75112

Top 5 slowest suites (by time):

Project (./spec/models/project_spec.rb:5) – 01:35.251 (75112 / 1015) of 03:56.954 (40.2%)



Finished in 4 minutes 3.7 seconds (files took 40.23 seconds to load)
1015 examples, 0 failures

[TEST PROF INFO] Factories usage

 Total: 2444
 Total top-level: 1509
 Total time: 153.3869s
 Total uniq factories: 67

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

     757         724      123.1303s            0.1627s           116.6218s            project
     592          17       25.5532s            0.0432s             0.9548s          namespace
     474         266       18.2324s            0.0385s             9.9789s               user
     131         127        3.8661s            0.0295s             3.7637s              group
      56           0        0.6584s            0.0118s             0.0000s    ci_job_artifact
      43          42        1.1878s            0.0276s             1.1602s        ci_pipeline
      29          28        1.6175s            0.0558s             1.5906s           ci_build
      27          27        0.2021s            0.0075s             0.2021s        ci_variable
      27          27        2.6921s            0.0997s             2.6921s      merge_request
      16          16        0.1191s            0.0074s             0.1191s         lfs_object
      16          16        0.5110s            0.0319s             0.5110s     note_on_commit
      15          15        3.4957s            0.2330s             3.4957s     project_member
      14          10        0.8507s            0.0608s             0.6969s            cluster
      13          13        0.3013s            0.0232s             0.3013s          ci_runner
      12          12        0.0876s            0.0073s             0.0876s lfs_objects_project
      12          12        0.6393s            0.0533s             0.6393s              issue
      11           0        0.2766s            0.0251s             0.0000s       package_file
      11          10        0.5303s            0.0482s             0.1257s        environment
      10           0        0.1929s            0.0193s             0.0000s conan_package_file
      10           0        0.0637s            0.0064s             0.0000s conan_file_metadatum
       9           9        0.1176s            0.0131s             0.1176s  ci_empty_pipeline
       9           9        0.0941s            0.0105s             0.0941s project_auto_devops
       8           8        0.0338s            0.0042s             0.0338s             upload
       8           8        0.8272s            0.1034s             0.8272s project_export_job
       7           7        0.1437s            0.0205s             0.1437s       deploy_token
       6           6        1.1097s            0.1850s             1.1097s  jira_import_state
       6           0        1.0651s            0.1775s             0.0000s              label
       6           6        0.1146s            0.0191s             0.1146s   protected_branch
       6           6        0.2975s            0.0496s             0.2975s prometheus_service
       5           5        0.0761s            0.0152s             0.0761s            service
       5           5        0.0300s            0.0060s             0.0300s       import_state
       5           5        0.0747s            0.0149s             0.0747s        group_badge
       5           5        0.2916s            0.0583s             0.2916s          chat_name
       4           0        0.1802s            0.0451s             0.0000s issue_tracker_data
       4           4        0.0371s            0.0093s             0.0371s project_repository
       4           4        0.0137s            0.0034s             0.0137s              shard
       4           4        0.2928s            0.0732s             0.2928s cluster_platform_kubernetes
       4           4        0.0819s            0.0205s             0.0819s ci_instance_variable
       4           4        0.0271s            0.0068s             0.0271s deploy_keys_project
       4           4        0.6592s            0.1648s             0.6592s       project_hook
       4           4        0.0715s            0.0179s             0.0715s      project_badge
       3           3        1.5483s            0.5161s             1.5483s    redmine_project
       3           0        0.9638s            0.3213s             0.0000s    redmine_service
       3           3        0.0172s            0.0057s             0.0172s service_desk_setting
       3           3        0.2352s            0.0784s             0.2352s         deploy_key
       3           3        0.0531s            0.0177s             0.0531s        npm_package
       2           2        0.5448s            0.2724s             0.5448s      maven_package
       2           0        0.3117s            0.1559s             0.0000s    maven_metadatum
       2           0        0.2937s            0.1468s             0.0000s            package
       2           2        0.0651s            0.0325s             0.0651s        npm_package
       2           2        0.6669s            0.3335s             0.6669s      conan_package
       2           0        0.4578s            0.2289s             0.0000s    conan_metadatum
       2           0        0.4441s            0.2221s             0.0000s      conan_package
       2           2        0.1058s            0.0529s             0.1058s              event
       2           2        0.3469s            0.1735s             0.3469s prometheus_project
       2           2        0.0374s            0.0187s             0.0374s      protected_tag
       2           2        0.4056s            0.2028s             0.4056s project_empty_repo
       2           2        0.0341s            0.0170s             0.0341s        system_hook
       2           2        0.6578s            0.3289s             0.6578s      slack_service
       2           2        0.5578s            0.2789s             0.5578s    pool_repository
       2           2        0.0565s            0.0283s             0.0565s     alerts_service
       1           1        0.0062s            0.0062s             0.0062s            license
       1           1        0.0986s            0.0986s             0.0986s container_expiration_policy
       1           1        0.0101s            0.0101s             0.0101s container_repository
       1           1        0.0488s            0.0488s             0.0488s      lfs_file_lock
       1           1        0.0722s            0.0722s             0.0722s custom_issue_tracker_service
       1           1        0.4835s            0.4835s             0.4835s         deployment

#240929 (closed)

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Security

If this MR contains changes to processing or storing of credentials or tokens, authorization and authentication methods and other items described in the security review guidelines:

  • [-] Label as security and @ mention @gitlab-com/gl-security/appsec
  • [-] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
  • [-] Security reports checked/validated by a reviewer from the AppSec team
Edited by Heinrich Lee Yu

Merge request reports