Sponsored Content
Top Forums Shell Programming and Scripting PERL - traverse sub directories and get test case results Post 302486452 by m.d.ludwig on Saturday 8th of January 2011 05:41:21 PM
Old 01-08-2011
While I am the first to work with PERL, I would turn to find and awk:
Code:
find "${@}" -type f -name .results -print | xargs awk '/^test case name:/ { testcase = $NF; } NR == FNR { printf "%-30s  %s\n", testcase, $NF; }'

but with PERL
Code:
use strict;
use warnings;

$\ = "\n";
$, = '';

my @FILELIST = ();
my @DIRLIST  = qw{ . };

# search the current directory and all subdirectories for result files

while (0 < @DIRLIST) {

    my $dir = shift @DIRLIST;

    unless (opendir DH, $dir) {
        print STDERR $dir, ': ', $!;
        next;
    }

    my @DL = readdir DH;
    close DH;

    for (@DL) {
        next if /^\./;

        my $entry = $dir . '/' . $_;

        if (m{\.results$}) {
            push @FILELIST, $entry;
            next;
        }
          
        if (-d $entry) {
            push @DIRLIST, $entry;
        }
    }

    closedir DH;
}

undef $/;
 
my %T = ();

# parse all result files

foreach my $file (@FILELIST) {
       
    unless (open FH, '<', $file) {
        print STDERR $file, ': ', $!;
        next;
    }

    $_ = <FH>;
    close FH;

    my ($testcase) = m{^test case name:\s+(\S+)\s*$}m;
    my ($status)   = m{(PASSED|FAILED)\s*$}m;

    unless (defined $testcase and defined $status) {
        print STDERR $file, ': not a results file';
        next;
    }

    if (defined $T{$testcase}) {
        print STDERR $file, ': duplicate testcase - ', $testcase, ' (', $status, ')';
        next;
    }
       
    $T{$testcase} = $status
}

$/ = "\n";

$_ = <>;
chomp;
print $_;

while (<>) {
    chomp;
    my ($sno, $testcase) = m{^\s*(\d+)\s+(\S+)\s*$};

    unless (defined $testcase) {
        print STDERR $ARGV, '(', $., '): malformed line - ', $_;
        next;
    }

    $T{$testcase} = 'UNDEFINED' unless defined $T{$testcase};
    printf "\%-4d \%-19s \%s\n", $sno, $testcase, $T{$testcase};
}


Last edited by m.d.ludwig; 01-08-2011 at 06:41 PM.. Reason: typo in "awk"
 

8 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Fastest way to traverse through large directories

Hi! I have thousands of sub-directories, and hundreds of thousands of files in them. What is the fast way to find out which files are older than a certain date? Is the "find" command the fastest? Or is there some other way? Right now I have a C script that traverses through and checks... (5 Replies)
Discussion started by: sreedharange
5 Replies

2. HP-UX

Different results from awk, sed, tr in different directories???

I cannot explain why it gives different results when I try the awk, sed, tr command combination with the same input. (aondufd1)psoftfs:/aon/dev/psoft/FSTST88/autosys>echo ${MailFile} + echo mfint003pr.in1* mfint003pr.in1* (aondufd1)psoftfs:/aon/dev/psoft/FSTST88/autosys/scripts>echo ${MailFile}... (2 Replies)
Discussion started by: james_falco
2 Replies

3. Programming

Ignore case in a test?

How do I ignore the case in an if condition..? EDIT: I put this in the wrong board...this is a linux script. if then echo "Same name." else echo "Different name." fi (1 Reply)
Discussion started by: Bandit390
1 Replies

4. Shell Programming and Scripting

find in given path do not want to traverse to its sub-directories

Hi All, My UNIX Version is: OS Name Release Version AIX appma538 3 5 I want to find certain files with some criterias under the given path. At the same time i want to find the files which resides under the given directory, but normal find traverse to its sub-directories... (4 Replies)
Discussion started by: Arunprasad
4 Replies

5. Shell Programming and Scripting

Prefixing test case methods with letter 'test'

Hi, I have a Python unit test cases source code file which contains more than a hundred test case methods. In that, some of the test case methods already have prefix 'test' where as some of them do not have. Now, I need to add the string 'test' (case-sensitive) as a prefix to those of the... (5 Replies)
Discussion started by: royalibrahim
5 Replies

6. OS X (Apple)

OS X 'find' nogroup/nouser doesn't traverse directories?

flamingo:~ joliver$ sudo find / -nogroup find: /dev/fd/4: No such file or directory find: /home: No such file or directory find: /Library: No such file or directory find: /net: No such file or directory find: /Network: No such file or directory find: /private: No such file or directory find:... (2 Replies)
Discussion started by: jnojr
2 Replies

7. Shell Programming and Scripting

Trying to test for both upper and lower case directories

I am trying to get a script to print out whether a directory is lowercase uppercase or both. This is what I've got so far: echo -e read "enter name" read server for DIR in $(find /tmp/$server -type d -prune | sed 's/\.\///g');do if expr match "$server" "*$" > /dev/null; then echo "$server -... (7 Replies)
Discussion started by: newbie2010
7 Replies

8. Shell Programming and Scripting

Traverse through directories

Hi all, Require help in completing a shell script. i do have a total of 90 directories where in we have different sub-directories and one of the sub directory named logs I need to go inside the logs subdirectory and check if a particular log is present or not. for example below is the... (3 Replies)
Discussion started by: bhaskar t
3 Replies
Test::Strict(3pm)					User Contributed Perl Documentation					 Test::Strict(3pm)

NAME
Test::Strict - Check syntax, presence of use strict; and test coverage SYNOPSIS
"Test::Strict" lets you check the syntax, presence of "use strict;" and presence "use warnings;" in your perl code. It report its results in standard "Test::Simple" fashion: use Test::Strict tests => 3; syntax_ok( 'bin/myscript.pl' ); strict_ok( 'My::Module', "use strict; in My::Module" ); warnings_ok( 'lib/My/Module.pm' ); Module authors can include the following in a t/strict.t and have "Test::Strict" automatically find and check all perl files in a module distribution: use Test::Strict; all_perl_files_ok(); # Syntax ok and use strict; or use Test::Strict; all_perl_files_ok( @mydirs ); "Test::Strict" can also enforce a minimum test coverage the test suite should reach. Module authors can include the following in a t/cover.t and have "Test::Strict" automatically check the test coverage: use Test::Strict; all_cover_ok( 80 ); # at least 80% coverage or use Test::Strict; all_cover_ok( 80, 't/' ); DESCRIPTION
The most basic test one can write is "does it compile ?". This module tests if the code compiles and play nice with "Test::Simple" modules. Another good practice this module can test is to "use strict;" in all perl files. By setting a minimum test coverage through "all_cover_ok()", a code author can ensure his code is tested above a preset level of kwality throughout the development cycle. Along with Test::Pod, this module can provide the first tests to setup for a module author. This module should be able to run under the -T flag for perl >= 5.6. All paths are untainted with the following pattern: "qr|^([-+@w./:\]+)$|" controlled by $Test::Strict::UNTAINT_PATTERN. FUNCTIONS
syntax_ok( $file [, $text] ) Run a syntax check on $file by running "perl -c $file" with an external perl interpreter. The external perl interpreter path is stored in $Test::Strict::PERL which can be modified. You may prefer "use_ok()" from Test::More to syntax test a module. For a module, the path (lib/My/Module.pm) or the name (My::Module) can be both used. strict_ok( $file [, $text] ) Check if $file contains a "use strict;" statement. "use Moose" and "use Mouse" are also considered valid. This is a pretty naive test which may be fooled in some edge cases. For a module, the path (lib/My/Module.pm) or the name (My::Module) can be both used. warnings_ok( $file [, $text] ) Check if warnings have been turned on. If $file is a module, check if it contains a "use warnings;" or "use warnings::..." or "use Moose" or "use Mouse" statement. If the perl version is <= 5.6, this test is skipped ("use warnings" appeared in perl 5.6). If $file is a script, check if it starts with "#!...perl -w". If the -w is not found and perl is >= 5.6, check for a "use warnings;" or "use warnings::..." or "use Moose" or "use Mouse" statement. This is a pretty naive test which may be fooled in some edge cases. For a module, the path (lib/My/Module.pm) or the name (My::Module) can be both used. all_perl_files_ok( [ @directories ] ) Applies "strict_ok()" and "syntax_ok()" to all perl files found in @directories (and sub directories). If no <@directories> is given, the starting point is one level above the current running script, that should cover all the files of a typical CPAN distribution. A perl file is *.pl or *.pm or *.t or a file starting with "#!...perl" If the test plan is defined: use Test::Strict tests => 18; all_perl_files_ok(); the total number of files tested must be specified. You can control which tests are run on each perl site through: $Test::Strict::TEST_SYNTAX (default = 1) $Test::Strict::TEST_STRICT (default = 1) $Test::Strict::TEST_WARNINGS (default = 0) $Test::Strict::TEST_SKIP (default = []) "Trusted" files to skip all_cover_ok( [coverage_threshold [, @t_dirs]] ) This will run all the tests in @t_dirs (or current script's directory if @t_dirs is undef) under Devel::Cover and calculate the global test coverage of the code loaded by the tests. If the test coverage is greater or equal than "coverage_threshold", it is a pass, otherwise it's a fail. The default coverage threshold is 50 (meaning 50% of the code loaded has been covered by test). The threshold can be modified through $Test::Strict::COVERAGE_THRESHOLD. You may want to select which files are selected for code coverage through $Test::Strict::DEVEL_COVER_OPTIONS, see Devel::Cover for the list of available options. The default is '+ignore,"/Test/Strict"'. The path to "cover" utility can be modified through $Test::Strict::COVER. The 50% threshold is a completely arbitrary value, which should not be considered as a good enough coverage. The total coverage is the return value of "all_cover_ok()". CAVEATS
For "all_cover_ok()" to work properly, it is strongly advised to install the most recent version of Devel::Cover and use perl 5.8.1 or above. In the case of a "make test" scenario, "all_perl_files_ok()" re-run all the tests in a separate perl interpreter, this may lead to some side effects. SEE ALSO
Test::More, Test::Pod. Test::Distribution, <Test:NoWarnings> AUTHOR
Pierre Denis, "<pdenis@gmail.com>". COPYRIGHT
Copyright 2005, 2010 Pierre Denis, All Rights Reserved. You may use, modify, and distribute this package under the same terms as Perl itself. perl v5.10.1 2010-02-14 Test::Strict(3pm)
All times are GMT -4. The time now is 07:34 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy