11
votes

Test vraiment lent avec les téléchargements de fichiers

Je viens d'ajouter des validations pour une image de porteur d'un modèle à un modèle et les tests actuels sont vraiment lents. Comment puis-je accélérer ce processus? Je me sens comme s'il doit y avoir une meilleure façon. Strong>

Je cours sans validations et que vous pourrez utiliser mes tests RSPEC dans environ 140 secondes, mais depuis que je validai maintenant la présence de la présence de : display_pic code> J'ai dû ajouter des téléchargements de fichiers réels à mon usine de projet. Cela l'a augmenté à 240 secondes! 140 était déjà du côté lourd, c'est juste fou. P>

Voici comment la page Carrierwave Github recommande de configurer Factory Girl: P>

CarrierWave.configure do |config|
  config.storage = :file
  config.enable_processing = false
end


0 commentaires

5 Réponses :


9
votes

Vos téléchargements sont-ils stockés localement ou allez-ils dans un service de nuage comme S3? Si ce dernier, c'est probablement ce qui tue vos performances de test.

Pour les tests, c'est toujours une bonne pratique de se moquer de dépendances externes. Si tel est votre problème, vous devez utiliser un outil pour se moquer de la connexion. Je pense que le GEM de brouillard est livré avec prise en charge intégrée pour cela. P>

mise à jour : concernant la réponse de Jefferson girao , j'ai utilisé un tour pour éviter d'ouvrir un fichier de test et à l'aide de StringIO pour simuler Tests des fichiers à des fins d'usine. Cela fonctionne mieux car il évite l'accès du disque: P>

def test_file_stream(filename = 'test.jpg', mime_type='image/jpg', content = '')
  StringIO.new(content).tap do |s|
    s.content_type = mime_type
    s.original_filename = filename
  end
end


6 commentaires

Oui merci, ceci est déjà fait config.storage =: fichier dans la conduite d'onde de support Configurer les forces du bloc qui, en production, il est défini sur le brouillard


Intéressant. Je suis hors de suppositions alors. Désolé.


Cela s'est produit (les 140 secondes de différence) B / C comme fille d'usine l'évalue paresseusement, il n'a jamais été exécuté avant. Maintenant, comme vous avez la validation exécutée, l'attribut sera toujours accepté.


Merci pour cela, c'est fantastique!


Cela n'a pas fonctionné pour moi. StringIO n'a ni un "content_type" ni un attribut "original_filename".


@Pablomarambio - Je pense que PaperClip les mélange dans.



6
votes

Avec la validation qui se produit maintenant, une instance est créée l'attribut Display_pic est accessible et le code à l'intérieur des crochets

FactoryGirl.define do
  factory :project do
    display_pic { File.open(File.join(Rails.root, 'spec', 'support', 'projects', 'display_pics', 'test.jpg')) }

    to_create do |instance|
      instance.save!(:validate => false)
    end 
  end
end


4 commentaires

Je préférerais ne pas contourner les validations. Dans PaperClip, vous pouvez remplir le champ Pic avec une chaîne, j'espérais quelque chose sur ces lignes.


Merci pour la réponse, je comprends que cela est logique qu'il faudrait plus de temps à charger, la durée de charge est toutefois trop à des fins de test, dans l'espoir d'un moyen de le minimiser.


C'est la meilleure solution que j'ai vue si loin et ça marche, merci


Mon mauvais, j'étais MIA quand la généraliste a expiré, à moins que quelqu'un ne propose un moyen de se moquer de maroger les téléchargements de fichiers avec Carrierwave malade, passez simplement à vous 100 à vous.



1
votes

Vous avez probablement envisagé cela déjà, mais le ralentissement de 100 secondes est-il lié à un téléchargement de fichier ? Si c'est un agrégat sur tous les tests, il doit y avoir un moyen de les structurer de manière à ce que vous ayez un seul test (ou quelques-uns) qui valident la présence du fichier et le reste du temps que vous vous moquez de vous moquer.


1 commentaires

Souhaitez-vous suggérer quelque chose de différent de Jefferson Girao ou d'accord avec cela?



1
votes

Je viens de frapper ce problème, cela peut aider à le résoudre en stockant le fichier en mémoire plutôt que de laisser l'usine lire l'image à partir de disque à chaque test. J'utilise quelque chose comme ce qui suit. XXX

Je pense avoir économisé environ 10% de temps sur ma suite de tests, mais ma suite de test est une variable silencieuse, donc je ne peux pas être absolument sûr. Quoi qu'il en soit, juste quelque chose à considérer si quelqu'un frappe cette question.

Je n'aime pas vraiment la solution qui vous oblige à ne pas valider le modèle. Je suppose que cela ressemble à la réponse Stringio de Wolfram Arnold, bien que je pense que cette façon est un peu plus facile à comprendre.


0 commentaires

3
votes

avec inspiration de @jeffersongirao et @ wolfram arnold : xxx

deux éléments clés ici:

  1. Les Setteurs de téléchargement de Carrierwave peuvent donner un sens à un tas de choses. Ils le font en enveloppant ce qu'ils entrent dans un Carrierwave :: Sanitizéfile . Une des choses qu'il peut prendre est un hachage, comme ici.

  2. Carrierwave :: sanitizéfile se soucie de savoir si le fichier est vide. J'ai passé beaucoup trop à me demander pourquoi cela n'accepterait pas mon stringio.new . Il a besoin là pour y avoir quelque chose de là, mais cela ne se soucie pas de quoi. Je lui ai donné un koala.


0 commentaires