te')); return $arr; } /* 遍历用户所有主题 * @param $uid 用户ID * @param int $page 页数 * @param int $pagesize 每页记录条数 * @param bool $desc 排序方式 TRUE降序 FALSE升序 * @param string $key 返回的数组用那一列的值作为 key * @param array $col 查询哪些列 */ function thread_tid_find_by_uid($uid, $page = 1, $pagesize = 1000, $desc = TRUE, $key = 'tid', $col = array()) { if (empty($uid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('uid' => $uid), array('tid' => $orderby), $page, $pagesize, $key, $col); return $arr; } // 遍历栏目下tid 支持数组 $fid = array(1,2,3) function thread_tid_find_by_fid($fid, $page = 1, $pagesize = 1000, $desc = TRUE) { if (empty($fid)) return array(); $orderby = TRUE == $desc ? -1 : 1; $arr = thread_tid__find($cond = array('fid' => $fid), array('tid' => $orderby), $page, $pagesize, 'tid', array('tid', 'verify_date')); return $arr; } function thread_tid_delete($tid) { if (empty($tid)) return FALSE; $r = thread_tid__delete(array('tid' => $tid)); return $r; } function thread_tid_count() { $n = thread_tid__count(); return $n; } // 统计用户主题数 大数量下严谨使用非主键统计 function thread_uid_count($uid) { $n = thread_tid__count(array('uid' => $uid)); return $n; } // 统计栏目主题数 大数量下严谨使用非主键统计 function thread_fid_count($fid) { $n = thread_tid__count(array('fid' => $fid)); return $n; } ?>javascript - Cypress: how to mark a single test as failed but continue to run other tests? - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Cypress: how to mark a single test as failed but continue to run other tests? - Stack Overflow

programmeradmin3浏览0评论

Currently when a single test in it() block fails Cypress halts pletely.

I want Cypress to continue running subsequent assertions within the test, regardless if a previous assertion failed or not (but I still want to mark the failed tests so I know which one failed).

I tried to intercept the fail event in beforeEach:

beforeEach(() => {
        Cypress.on('fail', (error, runnable) => {
            cy.log('this single test failed, but continue other tests');
            // don't stop!
            // throw error; // marks test as failed but also makes Cypress stop
        });

But it appears I cannot use any cy mands inside this handler because when I do it returns an error due to Cypress weird internal promise logic:

CypressError: Cypress detected that you returned a promise from a mand while also invoking one or more cy mands in that promise.

The mand that returned the promise was:

cy.wait()

The cy mand you invoked inside the promise was:

cy.log()

Because Cypress mands are already promise-like, you don't need to wrap them or return your own promise.

Cypress will resolve your mand with whatever the final Cypress mand yields.

The reason this is an error instead of a warning is because Cypress internally queues mands serially whereas Promises execute as soon as they are invoked. Attempting to reconcile this would prevent Cypress from ever resolving.

If I leave the Cypress.on('fail') block empty all tests are going to be marked as passed even if they fail.

If I unment throw error Cypress will halt pletely on any failed test.

Currently when a single test in it() block fails Cypress halts pletely.

I want Cypress to continue running subsequent assertions within the test, regardless if a previous assertion failed or not (but I still want to mark the failed tests so I know which one failed).

I tried to intercept the fail event in beforeEach:

beforeEach(() => {
        Cypress.on('fail', (error, runnable) => {
            cy.log('this single test failed, but continue other tests');
            // don't stop!
            // throw error; // marks test as failed but also makes Cypress stop
        });

But it appears I cannot use any cy mands inside this handler because when I do it returns an error due to Cypress weird internal promise logic:

CypressError: Cypress detected that you returned a promise from a mand while also invoking one or more cy mands in that promise.

The mand that returned the promise was:

cy.wait()

The cy mand you invoked inside the promise was:

cy.log()

Because Cypress mands are already promise-like, you don't need to wrap them or return your own promise.

Cypress will resolve your mand with whatever the final Cypress mand yields.

The reason this is an error instead of a warning is because Cypress internally queues mands serially whereas Promises execute as soon as they are invoked. Attempting to reconcile this would prevent Cypress from ever resolving.

https://on.cypress.io/returning-promise-and-mands-in-another-mand

If I leave the Cypress.on('fail') block empty all tests are going to be marked as passed even if they fail.

If I unment throw error Cypress will halt pletely on any failed test.

Share Improve this question edited Feb 28, 2023 at 1:31 K.A.Plilkington 1718 bronze badges asked Jul 19, 2019 at 11:26 van_folmertvan_folmert 4,51710 gold badges51 silver badges96 bronze badges 1
  • 2 Which version are you using? Cypress doesn't fail-early (and never did AFAIK), so this behavior you're describing is weird. Can you share a reproducible repo? – dwelle Commented Nov 1, 2019 at 11:41
Add a ment  | 

3 Answers 3

Reset to default 2

My way to ensure subsequent tests are done, and the failed test is marked as failure is - to put every it case in different file, and if needed to group them - I group them in a separate subfolder.

It has improved readability of reports and cypress tests run time, since before that I sometimes had problems with cypress not clearing its state between tests and we had memory leaks.

If you throw error in your test it will halt the script in the same way it does when there is an issue with the code. This is functioning as expected. You may need to revisit your test logic and consider adding some stubs/spies that wouldn't set the exit code to 1.

There is a lack of this feature(see this issue:https://github./cypress-io/cypress/issues/518). If you read through it you will find some code snippets that mention throwing an error to stop the test runner. You are doing this with the opposite intent.

If you must throw the error and NOT have the test runner bail, you need to catch it.

Is there a reason why don't you want to place tests in the different it() blocks?

If there is not, then definitely do it. Makes reports much more readable and ensures clean state before each test.

If you need to persist the application state between it()'s, consider using cy.session() (if your cypress version is new enough). Otherwise, there are some methods for getting, saving, and later using cookies. There are different options, so if you need further help, please describe your issue more.

Some useful links: cy.session() cy.getCookie()

发布评论

评论列表(0)

  1. 暂无评论