почтальон - как проверить размер картинки

Я пытаюсь написать несколько тестов в Postman (я запускаю упакованное приложение Postman Jetpacks, если это имеет значение), и я сталкиваюсь с некоторыми несоответствиями.

Целью моего теста является проверка размера (ширины и высоты) набора изображений на соответствие некоторым предопределенным значениям.

Сценарий такой: я вызываю метод, который возвращает некоторые URL-адреса, затем я устанавливаю URL-адреса в качестве переменных среды, а затем проверяю размер каждого изображения. Ниже приведен код, который я использую на вкладке «Тесты» в Postman.

tests["Status code is 200"] = responseCode.code === 200;

var data = JSON.parse(responseBody);

//test that response contains the expected attributes
tests["splash_image_url present"] = data.hasOwnProperty("splash_image_url");
tests["home_image_url present"] = data.hasOwnProperty("home_image_url");
tests["login_image_url present"] = data.hasOwnProperty("login_image_url");
tests["register_image_url present"] = data.hasOwnProperty("register_image_url");
tests["splash_logo_url present"] = data.hasOwnProperty("splash_logo_url");
tests["bar_logo_url present"] = data.hasOwnProperty("bar_logo_url");

//set each image URL as environment variable
postman.setEnvironmentVariable("splash_image_url", data.splash_image_url);
postman.setEnvironmentVariable("home_image_url", data.home_image_url);
postman.setEnvironmentVariable("login_image_url", data.login_image_url);
postman.setEnvironmentVariable("register_image_url", data.register_image_url);
postman.setEnvironmentVariable("splash_logo_url", data.splash_logo_url);
postman.setEnvironmentVariable("bar_logo_url", data.bar_logo_url);


//extract images from each URL
var splash_image_url = document.createElement("img");
splash_image_url.src = environment.splash_image_url;
var home_image_url = document.createElement("img");
home_image_url.src = environment.home_image_url;
var login_image_url = document.createElement("img");
login_image_url.src = environment.login_image_url;
var register_image_url = document.createElement("img");
register_image_url.src = environment.register_image_url;
var splash_logo_url = document.createElement("img");
splash_logo_url.src = environment.splash_logo_url;
var bar_logo_url = document.createElement("img");
bar_logo_url.src = environment.bar_logo_url;

//test the size for each picture 
tests["splash_image_url width"] = splash_image_url.width === 640;
tests["splash_image_url height"] = splash_image_url.height === 960;

tests["home_image_url width"] = home_image_url.width === 640;
tests["home_image_url height"] = home_image_url.height === 960;

tests["login_image_url width"] = login_image_url.width === 640;
tests["login_image_url height"] = login_image_url.height === 960;

tests["register_image_url width"] = register_image_url.width === 640;
tests["register_image_url height"] = register_image_url.height === 960;

tests["splash_logo_url width"] = splash_logo_url.width === 310;
tests["splash_logo_url height"] = splash_logo_url.height === 80;

tests["bar_logo_url width"] = bar_logo_url.width === 155;
tests["bar_logo_url height"] = bar_logo_url.height === 40;

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

Я что-то упускаю или делаю что-то не так? Есть ли способ проверить размер изображения?

Спасибо


person user4519133    schedule 02.02.2015    source источник
comment
Возможно ли, что тесты терпят неудачу, потому что вы получаете 304 - Не модифицировано с пустым телом вместо 200? Попробуйте добавить CacheControl: no-cache в запрос   -  person Darrel Miller    schedule 03.02.2015
comment
Я обнаружил следующее: - для параметра почтальона отправить заголовок без кэширования по умолчанию в настройках установлено значение включено - статус ответа, показанный в почтальоне, всегда 200 OK — проверка журналов доступа на стороне сервера также подтверждает, что статус 200 OK Думаю, мы можем исключить эту возможность. В любом случае спасибо за предложение.   -  person user4519133    schedule 05.02.2015


Ответы (1)


Очень хороший вопрос, был забавным вызовом. Спасибо !

1. Ваша проблема

Тесты на самом деле работают после того, как вы запустите их вручную пару раз, потому что изображения кэшируются в этот момент.

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

2. Результаты теста почтальона

Я попытался проверить концепцию этого, дождавшись фактической загрузки изображений, и обнаружил... что мои тесты на самом деле не отображались ни как пройденные, ни как не пройденные.

В основном это было связано со способом запуска тестов. Почтальон использует eval в контексте запроса (более или менее).

в Evaluator.js @ 111

if (command === "runcode") {
    try {
        var result = eval(code);
        event.source.postMessage({'type': 'test_result', 'result': result, 'scriptType': scriptType}, event.origin);
    }
    catch(e) {
        console.log(e);
        event.source.postMessage({'type': 'test_error', 'errorMessage': e.message, 'scriptType': scriptType}, event.origin);
    }

}

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

2.1 Результаты вторичного теста почтальона

Похоже, что публикация нового набора результатов в event.source не вызовет новый набор результатов, а будет полностью отброшена.

Мне удалось найти обходной путь для этого. Просто завершите скрипт:

function postmanJetpacksSupportsOnlyOneResultPerTest()
{
    event.source.postMessage({'type': 'test_result', 'result': tests, 'scriptType': 'test'}, event.origin);
}

throw 'ignore this. Enforcing failure on this test case, real values will come  by manually calling *postmanJetpacksSupportsOnlyOneResultPerTest* when you are done with the test case.';

Затем просто вызовите postmanJetpacksSupportsOnlyOneResultPerTest, когда все ваши обратные вызовы будут выполнены.

3. Разработчики почтальона

Я очень надеюсь, что вы сможете каким-то образом включить концепцию обещаний. Пример:

В средстве запуска тестов:

var defered = new jQuery.Deferred();
tests['before timeout'] = true;
setTimeout(function() {
    tests['on timeout'] = true;
    defered.resolve(tests);
}, 500);
tests['after timeout'] = true;
return defered.promise();

В Evaluator.js @ 113:

var result = eval(code);
if (result.promise instanceof Function) {
    result.then(function(result) {
       event.source.postMessage({'type': 'test_result', 'result': result, 'scriptType': scriptType}, event.origin);
    });
} else {
    event.source.postMessage({'type': 'test_result', 'result': result, 'scriptType': scriptType}, event.origin);
}

4. Пример

// handlers
var waiting = 0;
function errorHandler() {
    waiting--;
    tests[this.image.name + ' load'] = false;

}
function successHandler() {
    waiting--;
    tests[this.image.name + ' load'] = true;
    tests[this.image.name + ' width'] = this.image.width == this.width;
    tests[this.image.name + ' height'] = this.image.height == this.height;
}

// test case kind of
function createImageTest(name, url, width, height)
{
    // create image tag
    var image = document.createElement('img');
    // set the name
    image.name = name;
    // set error handlers
    image.onerror = errorHandler.bind({
        image: image
    });
    image.onload = successHandler.bind({
        image: image,
        width: width,
        height: height
    });
    // finally attach the src
    image.src = url;
    // waiting on either a fail or a load
    waiting++;
}

// the actual test cases
createImageTest('stackexchange logo', 'http://cdn.sstatic.net/stackexchange/img/se-logo.png', 223, 52);
createImageTest('stackoverflow logo', 'http://cdn.sstatic.net/stackoverflow/img/sprites.png', 240, 500);

// wait for all callbacks finished
(function checkFinished(){
    // still images to process
    if (waiting) {
        // check back in another 0.1 seconds
        return setTimeout(checkFinished, 100);
    }

    // ready to send result
    postmanJetpacksSupportsOnlyOneResultPerTest();
})();

// the hack from #2.1
function postmanJetpacksSupportsOnlyOneResultPerTest()
{
    event.source.postMessage({'type': 'test_result', 'result': tests, 'scriptType': 'test'}, event.origin);
}

throw 'ignore this. Enforcing failure on this test case, real values will come from init...';
person Khez    schedule 04.02.2015
comment
Хез, спасибо за развернутый ответ. Ваш обходной путь обеспечивает большую гибкость при написании подробных тестов в Postman. Хотя на вкладке тестов правильно отображаются все тесты, кажется, что в пользовательском интерфейсе Postman возникла ошибка (Произошла ошибка при оценке тестового сценария. undefined) при выполнении вызова с кодом из вашего примера. Однако это сообщение об ошибке, похоже, ничего не ломает при вызове или тестировании, поэтому я звоню в прямом эфире с ошибкой. - person user4519133; 10.02.2015