2014-08-08 4 views
2

Я пытаюсь протестировать разные части «в основном» одностраничного приложения. Я хотел бы разделить тесты, но я действительно только хочу, чтобы загрузить страницу один раз, а затем испытания пройти и нажмите ссылки и т.д.Как правильно разбить тесты casperjs на общий экземпляр браузера

Вот мой код:

PRE.js

var port = require('system').env.PORT 
var tester; 

casper.options.viewportSize = {width: 1024, height: 768}; 

casper.test.begin('Test login', function suite(test) { 
    var done = false; 
    casper.on("page.error", function(msg, trace) { 
     this.echo("Error: " + msg, "ERROR"); 
     this.echo("file:  " + trace[0].file, "WARNING"); 
     this.echo("line:  " + trace[0].line, "WARNING"); 
     this.echo("function: " + trace[0]["function"], "WARNING"); 
    }); 

    casper.on('remote.message', function(message) { 
     this.echo('remote message caught: ' + message); 
     if (message == "done") { 
      done = true; 
     } 
    }); 

    casper.start('http://localhost:' + port, function() { 

    // Verify that the main menu links are present. 
     test.assertExists('input[name=username]'); 
     // 10 articles should be listed. 
     test.assertElementCount('input', 3); 
     casper.fill("form", { 
      "username": "username", 
      "password": "my password goes right here you cant have it" 
     }, true); 
     casper.then(function() { 
       casper.waitFor(function(){ 
        return done; 
        }, function(){ 
        tester = casper.evaluate(function(){ 
         return tester; 
        }); 
        test.assert("undefined" != typeof tester); 
        test.assert(Object.keys(tester).length > 0); 
       }); 
     }); 
    }); 

    casper.run(function() { 
     test.done(); 
    }); 
}); 

, а затем у меня есть второй файл (и там будет много больше, как это): TEST.js

casper.test.assert(true); 

casper.capture('.screenshot.png'); 
casper.test.done(); 

Я надеюсь, чтобы получить скриншот сессии браузера сюда m pre.js.

я запускаю его из специализированной программы, которая начинается мою программу, но по существу она работает:

casperjs test casper_tests --pre=pre.js 

casper_tests держит оба файла выше

Мой вопрос:

Что это правильный путь сделать это? Не снимается скриншот и, возможно, более важно (хотя я еще не пробовал это делать), я хочу, чтобы можно было щелкнуть внутри и убедиться, что другие части работают. Снимок экрана просто проверяет, что я в правильном районе.

ответ

4

Это будет нелегко и потенциально опасно. Каждое действие, которое вы делаете, должно быть отменено, чтобы не нарушать другие тесты. Если позже вы решите, что письменные тесты в модульной манере - это хорошо, у вас будет головная боль, которая будет писать ваши тесты.

PRE.js будет вашим стартовым скриптом, который вы модифицируете для выполнения ваших тестов между ними. В следующем полнофункциональном примере вы увидите, как вы можете запланировать несколько тестовых случаев для одного запуска casper. Это плохо, потому что тестовый случай canvas зависит от правильного исполнения back тестового примера link.

casper.start('http://example.com'); 
casper.then(function() { 
    this.test.begin("link", function(test){ 
     var url = casper.getCurrentUrl(); 
     test.assertExists("a"); 
     casper.click("a"); 
     casper.then(function(){ 
      test.assert(this.getCurrentUrl() !== url); 
      this.back(); // this is bad 
      test.done(); 
     }); 
    }); 
    this.test.begin("canvas", function(test){ 
     test.assertNotExists("canvas"); 
     test.done(); 
    }); 
}); 
casper.run(); 

Конечно, вы можете снова открыть корень для нового тестового примера, но тогда у вас такая же проблема, как и с исходным кодом.

var url = 'http://example.com'; 
casper.start(); 
casper.thenOpen(url, function() { 
    this.test.begin("link", function(test){ 
     var url = casper.getCurrentUrl(); 
     test.assertExists("a"); 
     casper.click("a"); 
     casper.then(function(){ 
      test.assert(this.getCurrentUrl() !== url); 
      test.done(); 
     }); 
    }); 
}); 
casper.thenOpen(url, function() { 
    this.test.begin("canvas", function(test){ 
     test.assertNotExists("canvas"); 
     test.done(); 
    }); 
}); 
casper.run(); 

Теперь тестовые случаи не зависят друг от друга, но вы также загружаете страницу несколько раз.


Если вам нужны начальные действия для каждого тестового примера, то PRE.js не подходит для этого.

Создать include.js и поместить следующий код там:

function login(suite, username, password){ 
    username = username || "defaultUsername"; 
    password = password || "defaultPassword"; 
    casper.test.begin('Test login', function suite(test) { 
     var done = false; 
     // event handlers 

     casper.start('http://localhost:' + port, function() { 
      // login if the session expired or it is the first run 
      if (!loggedIn) { 
       // login 
      } 
      // wait 
     }); 

     casper.then(function(){ 
      suite.call(casper, test); 
     }); 

     casper.run(function() { 
      test.done(); 
     }); 
    }); 
} 

Затем вы можете запустить его как casperjs test casper_tests --includes=include.js с тестовыми файлами как

login(function(test){ 
    this.click("#something"); 
    this.waitForSelector(".somethingChanged"); 
    this.then(function(){ 
     test.assertExists(".somethingElseAlsoHappened"); 
    }); 
}); 

Конечно вы можете иметь различные login функции (с разные имена) или более легкие.


Основываясь на предыдущих фрагментах, вы можете создать сценарий запуска и загрузить тестовые файлы самостоятельно. Тогда у вас есть все необходимое для этого.

include.js:

function login(testScript, username, password, next){ 
    // event handlers 

    casper.start('http://localhost:' + port, function() { 
     // login if the session expired or it is the first run 
     // waiting 
    }); 

    testScript.forEach(function(case){ 
     casper.thenOpen(case.name, function(){ 
      this.test.begin(function suite(test){ 
       case.func.call(casper, test); 
       casper.then(function(){ 
        test.done(); 
       }); 
      }); 
     }); 
    }); 

    casper.run(next); 
} 

start.js:

// pass the test file folder to the script and read it with sys.args 
// fs.list(path) all files in that path and iterate over them 
var filesContents = files.map(function(filename){ 
    return require(filename).testcases; 
}); 
var end = null; 
// stack the test cases into the `run` callback of the previous execution 
filesContents.forEach(function(case){ 
    var newEnd = end; 
    var newFunc = function(){ login(case, u, p, newEnd) }; 
    end = newFunc; 
}); 
end(); // run the stack in reverse 

каждый тестовый файл будет выглядеть следующим образом:

exports.testcases = [ 
    { 
     name: "sometest", 
     func: function(test){ 
      test.assert(true) 
      this.echo(this.getCurrenturl()); 
     } 
    }, 
    { 
     name: "sometest2", 
     func: function(test){ 
      test.assert(true) 
      this.echo(this.getCurrenturl()); 
     } 
    }, 
]; 

Это просто предложение.

+0

Что делать, если мы предполагаем, что тестовые случаи не должны быть отменены? (что я определенно понимаю, против обычной философии тестирования). Однако я буду играть с идеей include, но она все еще не поддерживает сеанс браузера. – silkcom

+0

Да, это так. Это будет тот же сеанс, если вы не удалите файлы cookie. Каждый тестовый файл и тестовый файл запускаются на одном экземпляре phantomjs, и файлы cookie никогда не удаляются из самого касса. –

+0

Извините, я имею в виду в том же экземпляре страницы браузера. Ему все равно придется перезагружать страницу между каждым тестом, в котором я пытаюсь найти способ избежать (существуют разные классы, и я бы хотел, чтобы каждый набор выполнялся в одной загрузке браузера) – silkcom

Смежные вопросы