IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Récupérer le contenu du terminal


Sujet :

Java

  1. #1
    Membre régulier
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Points : 102
    Points
    102
    Par défaut Récupérer le contenu du terminal
    Bonjour !

    Je me demandais s'il existait une manière d'aller récupérer le contenu du terminal...

    Pour être plus précis, imaginons une classe HelloWorld dont la méthode principale contiendrait l'unique instruction System.out.println("Hello World!"); (oui, je sais, je suis très imaginatif !)... Je voudrais écrire une classe HelloWorldTEST dans laquelle je trouverais une méthode public void test(){...} dans laquelle j'aimerais récupérer ce qui a été affiché (dans le terminal) via la méthode main() de la classe HelloWorld.

    Pour être complet, j'ajouterais que je suis tombé sur le site d'apprentissage au Python dans le secondaire, que ça m'inspire un peu, j'aimerais faire ça en Java ... Je suis en train de voir comment fonctionnent les JUnit et Cie (d'ailleurs, pour le moment je patauge un peu, mais ça, ça devrait finir par aller ... Néanmoins, si quelqu'un a un chouette "canevas" de classe test à proposer, je suis preneur ! ).

    Merci beaucoup !

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    L'avantage des tests c'est qu'il vous permettent de mieux structurer votre code.

    Dans votre cas, vous auriez une classe Greeter avec une méthode greet():void. C'est simple mais difficilement testable et pas très modulaire car il faudrait changer le code si vous vouliez saluer via un autre flux que la console.

    Une solution serait donc d'introduire un paramètre dans votre Greeter. Ce paramètre serait le stream sur lequel il faut saluer. A partir de ce moment, votre test peut facilement créer le sujet du test (instance de Greeter) avec un stream qui vous permets de tester facilement le résultat. Un ByteArrayOutputStream par exemple.

  3. #3
    Membre régulier
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par gervais.b Voir le message
    L'avantage des tests c'est qu'il vous permettent de mieux structurer votre code.

    Dans votre cas, vous auriez une classe Greeter avec une méthode greet():void. C'est simple mais difficilement testable et pas très modulaire car il faudrait changer le code si vous vouliez saluer via un autre flux que la console.

    Une solution serait donc d'introduire un paramètre dans votre Greeter. Ce paramètre serait le stream sur lequel il faut saluer. A partir de ce moment, votre test peut facilement créer le sujet du test (instance de Greeter) avec un stream qui vous permets de tester facilement le résultat. Un ByteArrayOutputStream par exemple.
    Bonsoir et merci d'avoir pris le temps de répondre ...

    En fait, en ce qui concerne mon besoin spécifique, je n'ai pas d'intérêt à aller préciser le stream sur lequel on balance les résultats. Je m'explique. J'aime beaucoup le cours d'apprentissage au Python qui est posté sur le site tech.io (voir ici). Ce site permet une exécution d'un code-source (en Python sur l'exemple, mais beaucoup de langages sont supportés, dont le java...) par un simple click sur RUN. Lorsque ce RUN est invoqué, il exécute le code mais peut aussi lancer la méthode test():void d'une classe MachinTEST qui vérifie si le résultat est bien celui qui est souhaité...

    Dans la pratique : on demande à l'élève de compléter le code d'une méthode void m() (ou bien void m(int n) ), d'une classe Appli, et puis lancer le RUN. Le RUN exécute le code de l'élève et le compare aux résultats attendus, dans une classe AppliTEST. Un message d'erreur peut apparaitre le cas échéant afin que l'élève sache ce qu'il en est et puisse éventuellement se corriger...

    Ce que j'aimerais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Appli{
      public static void main(String[] args){
        m();
      }
     
      public static void m(){
        //A COMPLETER PAR L'ELEVE
      }
    }
    Méthode à faire exécuter 'en direct' par l'élève...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class AppliTEST{
      @Test
      public void test() {
        //Si la méthode Appli.m() affiche "Hello World!", afficher "BRAVO"
        //Sinon afficher "Il y a une erreur, vérifiez votre syntaxe"
        // (ou quelque chose du genre ;-) )
        String resultat = ... ; // ???
        // avant un if(resultat == ... ) ... OU BIEN une autre manière utilisant ASSERT ... 
      }
    }
    Ce qu'il me faut, c'est donc récupérer ce qu'affiche Appli.m() . . .

    Je ne sais pas si je suis plus clair . . . 😅

    Merci d'avance !

  4. #4
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Dans ce cas, System.out n'est pas final. Vous devriez alors pouvoir lui affecter un autre PrintStream dans lequel vous enregistrerez les sorties.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    En fait, System.out est bel et bien final. Mais on peut changer vers où il écrit, en appelant System.setOut() et en y passant le PrintStream à utiliser à la place de celui par défaut.

    C'est à dire que System.out est final du point de vue du compilateur, mais pas du runtime. Je crois que c'est le seul champ de tout Java qui fonctionne comme ça. Un genre de cas particulier unique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Points : 102
    Points
    102
    Par défaut
    Merci de vos réponses . . . Ce n'est donc pas spécialement évident ... Je vais garder ça en mémoire, je n'ai pas le temps malheureusement de m'atteler à ça pour le moment . . . Je ne pensais pas que ça serait aussi compliqué, puisque ça ne semble pas très compliqué en Python.

    Au cas où une bonne âme s'en sentirait, je donne les codes en Python qu'il me plairait d'avoir en Java 😇 ... tjrs sur le site tech.io...

    Dans le code de la "page", on trouve la commande suivante, qui "ouvre" le 1er fichier *.py à compléter par l'apprenant et qui exécute le 2eme fichier *.py (le test) lors du click sur RUN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @[Exemple ]({"stubs": ["Variables_et_fonctions/Prise_en_main_Exo_1.py"], "command": "python3 Variables_et_fonctions/Hello_world_test.py"})
    "Prise_en_main_Exo_1.py"
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    def ma_fonction(a,b):
    	#Ne pas toucher ce qui précède
    	#Les valeurs pour les variables en entrée seront automatiquement données
    	#Ecrire ci-dessous en n'oubliant pas d'indenter

    "Hello_world_test.py"
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #Ne pas oublier de changer le module à importer
    from Prise_en_main_Exo_1 import ma_fonction
    import sys
    import io
     
     
    #liste des couples input/output
    input_output=[\
    ((3,4),"Hello World")\
    ]
     
     
    #message d'aide si besoin
    help="N'oublie pas d'utiliser print pour afficher le resultat et de le décaler."
     
     
     
    def send_msg(channel, msg):
        print("TECHIO> message --channel \"{}\" \"{}\"".format(channel, msg))
     
     
    def success():
        send_msg("Tests validés","Bravo !")
        print("TECHIO> success true")
     
     
    def fail():
        print("TECHIO> success false")
     
     
    def test():
        try:
          for inp,outp in input_output:
            sauvegarde_stdout=sys.stdout
            sys.stdout=io.StringIO()
            ma_fonction(*inp)
            count1 = sys.stdout.getvalue()[:-1]
            sys.stdout=sauvegarde_stdout
            assert str(count1) == str(outp), "Vous avez affiché {} au lieu de {}".format(str(count1),str(outp))
            send_msg("Tests validés","Très bien !")
          success()
        except AssertionError as e:
          fail()
          send_msg("Oops! ", e)
          if help:
            send_msg("Aide 💡", help)
        except IndentationError as e:
          fail()
          send_msg("Oops! ", "Attention à bien décaler ce que vous écrivez!")
     
     
    if __name__ == "__main__": test()

    (les lignes avec lesquelles j'ai du mal sont essentiellement les lignes 35-39 ... )

  7. #7
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 325
    Points : 436
    Points
    436
    Par défaut
    Certains "outils" demandent d'utiliser une classe spécifique avec des méthodes statiques pour faire les entrées sorties, ils peuvent donc facilement les contrôler.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/11/2013, 20h12
  2. Récupérer le contenu de la balise title
    Par roots dans le forum Langage
    Réponses: 2
    Dernier message: 11/09/2005, 16h17
  3. Récupérer le contenu d'un select
    Par PrinceMaster77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/08/2005, 15h38
  4. [ethereal] récupérer le contenu d'un fichier envoyé ?
    Par in dans le forum Développement
    Réponses: 1
    Dernier message: 19/06/2005, 15h44
  5. [Balise XML] Comment récupérer le contenu entre 2 balise?
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 5
    Dernier message: 05/03/2004, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo