Lệnh chạy thử nghiệm NUnit


110

Theo mặc định, các bài kiểm tra nunit chạy theo thứ tự bảng chữ cái. Có ai biết bất kỳ cách nào để đặt lệnh thực hiện? Có một thuộc tính tồn tại cho điều này?


7
Tại sao bạn muốn làm điều này? Có vẻ như bạn phụ thuộc vào lệnh chạy, đó là một điều tồi tệ. Bạn cần xem xét lại lý do tại sao bạn muốn điều này. Các bài kiểm tra đơn vị nên chạy riêng lẻ và hoàn toàn độc lập với những bài kiểm tra khác. Có vẻ như bạn đang tạo ra các ứng cử viên cho các bài kiểm tra mùi Thử nghiệm thất thường .
RichardOD

Đây trông giống như một bản sao nhưng bạn có thể xem câu trả lời của tôi cho rằng đây
Johnno Nolan

12
@RichardOD - nên! = Phải. Và nó thực sự không phải là sự kiện nên làm, bởi vì thực sự hầu như tất cả các thử nghiệm tích hợp đều được chạy theo thứ tự - hãy hỏi nhóm QA của bạn xem họ có ngẫu nhiên hóa thứ tự thử nghiệm của họ không.
tymtam

4
Tôi hiện có một số bài kiểm tra có thứ tự dường như quan trọng mặc dù nó không nên. Cá nhân tôi muốn một cách ngẫu nhiên thứ tự thử nghiệm cụ thể để giúp tôi đảm bảo rằng các thử nghiệm của tôi KHÔNG phụ thuộc vào thứ tự nào đó. Tất nhiên, những gì tôi THỰC SỰ muốn là một người chạy thử nghiệm sẽ chạy tất cả các bài kiểm tra của tôi theo thứ tự ngẫu nhiên cho đến khi nó phát hiện ra vấn đề, hoặc tôi nói dừng lại. Nếu tôi chạy như vậy qua đêm, và mọi thứ vẫn xanh tươi vào buổi sáng, thì tôi có thể tự tin rằng mình đã loại bỏ được tác dụng phụ cuối cùng không mong muốn.
Mel

1
câu hỏi này sẽ phù hợp hơn nếu câu hỏi được cập nhật để chỉ rõ chúng ta đang nói về các bài kiểm tra tích hợp ở đây ... Tất cả chúng ta đều biết các quy tắc về kiểm thử đơn vị, ít nhất là nếu bạn đã đọc các mẫu kiểm tra XUnit và làm theo Bác Bob, v.v. bạn làm .. nhưng các khung công tác như NUnit cũng thực sự hữu ích để bắt đầu và chạy các thử nghiệm tích hợp một cách nhanh chóng .. và bạn chắc chắn không muốn những điều đó là ngẫu nhiên, đặc biệt là khi thiết lập cơ sở dữ liệu đắt tiền ..
nrjohnstone

Câu trả lời:


51

Mỗi bài kiểm tra đơn vị của bạn phải có thể chạy độc lập và độc lập. Nếu họ thỏa mãn tiêu chí này thì thứ tự không thành vấn đề.

Tuy nhiên, có những trường hợp bạn sẽ muốn chạy một số thử nghiệm trước. Một ví dụ điển hình là trong tình huống Tích hợp liên tục trong đó một số thử nghiệm chạy lâu hơn những thử nghiệm khác. Chúng tôi sử dụng thuộc tính category để chúng tôi có thể chạy các bài kiểm tra sử dụng chế độ giả trước các bài kiểm tra sử dụng cơ sở dữ liệu.

tức là đặt điều này khi bắt đầu các bài kiểm tra nhanh của bạn

[Category("QuickTests")]

Nơi bạn có kiểm tra mà phụ thuộc vào điều kiện môi trường nhất định, xem xét các TestFixtureSetUpTestFixtureTearDown thuộc tính, cho phép bạn đánh dấu các phương pháp được thực hiện trước và sau khi xét nghiệm của bạn.


2
@Chris, tôi có xu hướng không sử dụng các thuộc tính này, đây là một bài đăng thú vị trên blog- jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html . Tuy nhiên, điểm tốt về các bài kiểm tra thể loại.
RichardOD

29
Một ví dụ về kiểm tra phụ thuộc trật tự là khi bạn muốn sử dụng khuôn khổ nunit của bạn để chạy một thử nghiệm tích hợp ...
Byron Ross

1
@ByronRoss: Tôi có xu hướng thực hiện các bài kiểm tra lớn hơn khi tôi làm điều đó và dựa vào các bài kiểm tra đơn vị hiện có nhiều nhất có thể để tôi có thể viết ít bài kiểm tra hơn. Sau đó, mỗi lần chạy đầy đủ có thể bị lỗi riêng biệt. Tôi cũng cố gắng thiết kế dữ liệu của mình để nó có thể sống tách biệt với dữ liệu hiện có, thay vì phụ thuộc vào dữ liệu hiện có.
Merlyn Morgan-Graham

1
Nếu bạn không chạy các thử nghiệm của mình theo thứ tự ngẫu nhiên, làm thế nào bạn có thể xác minh rằng chúng thực sự hoạt động khi hết thứ tự? Những gì bạn đang nói tương tự như nói "Nếu phần mềm của bạn không có lỗi, việc kiểm tra là không cần thiết".
jforberg

@jforberg: Nếu bạn có một lỗi xảy ra ngẫu nhiên, bạn nói thế nào khi bạn đã sửa nó?
NeedHack

175

Tôi chỉ muốn chỉ ra rằng trong khi hầu hết những người trả lời cho rằng đây là các bài kiểm tra đơn vị, câu hỏi không chỉ rõ rằng chúng là gì.

nUnit là một công cụ tuyệt vời có thể được sử dụng cho nhiều tình huống thử nghiệm khác nhau. Tôi có thể thấy lý do thích hợp để muốn kiểm soát thứ tự thử nghiệm.

Trong những tình huống đó, tôi đã phải sử dụng đến việc kết hợp lệnh chạy vào tên thử nghiệm. Sẽ thật tuyệt nếu có thể chỉ định thứ tự chạy bằng một thuộc tính.


Bạn có nghĩa là bạn đã gọi các bài kiểm tra của mình chẳng hạn, 001_first_test 002_second_testv.v.?
ashes999,

Vâng, đúng vậy, mặc dù tôi thường sử dụng một mẫu cho phép tôi dễ dàng chèn các bài kiểm tra nếu cần, vì vậy có thể 010_first_test, 020_second_test, v.v.
Les

83
Cảm ơn bạn cho câu trả lời lành mạnh duy nhất ở đây. Đây là một câu hỏi cụ thể, nhưng các câu trả lời mơ hồ bằng cách nào đó đang được ủng hộ. Vâng, tất cả chúng ta đều biết kiểm tra đơn vị nên là gì, đó không phải là câu hỏi.
Egor Pavlikhin

1
Bạn không nên dựa vào thứ tự chạy là bảng chữ cái. Nhiều người chạy thử nghiệm chạy thử nghiệm của bạn đồng thời trên nhiều luồng hoặc quy trình và không nhất thiết phải theo thứ tự bảng chữ cái. Ví dụ: NCrunch ưu tiên các bài kiểm tra dựa trên mã bạn thay đổi (các bài kiểm tra bị ảnh hưởng), sau đó xem chúng có thất bại lần trước hay không, sau đó xem chúng chạy nhanh hay chậm. Nếu bạn muốn một thứ tự xác định , chỉ cần tạo một meta-runner cho các thử nghiệm đó và loại trừ chúng khỏi các lần chạy thông thường.
Abel

3
Một lý do chính đáng khác để chỉ định thứ tự là trước tiên hãy nắm bắt một số vấn đề trước khi tiếp tục với phần còn lại của bộ thử nghiệm. nói cách khác, nếu thử nghiệm tạo người dùng của tôi không thành công thì tôi không cần chạy mọi thứ khác trước khi tìm ra kết quả này. Trong thử nghiệm khác của tôi, tôi có thể chế nhạo người dùng nhưng điều quan trọng đối với tôi là đây là thử nghiệm đầu tiên không thành công - đặc biệt là khi bộ thử nghiệm lớn.
Bron Davies

125

NUnit 3.2.0 đã thêm một OrderAttribute, hãy xem:

https://github.com/nunit/docs/wiki/Order-Attribute

Thí dụ:

public class MyFixture
{
    [Test, Order(1)]
    public void TestA() { ... }


    [Test, Order(2)]
    public void TestB() { ... }

    [Test]
    public void TestC() { ... }
}

5
Thanx, thẳng vào vấn đề những gì tôi đang tìm kiếm - và không có các cuộc thảo luận, tại sao nó tốt hay xấu :)
aknoepfel

1
Và sau đó họ biến nó thành một số nguyên, thay vì thập phân, vì vậy nếu người ta phải chèn thử nghiệm, tất cả các thử nghiệm phải được đánh số lại.
epitka

Bạn luôn có thể bắt đầu với những con số rất lớn như hàng triệu hoặc cái gì đó nếu bạn muốn giới thiệu các mục trung gian theo cách đó - chỉ cần nhập thêm. Imo nên có một cách dễ dàng hơn để sắp xếp mọi thứ hơn là sử dụng các số cho mức độ ưu tiên như cây phụ thuộc phương thức, nhưng mỗi thứ đều có nhược điểm / lợi thế riêng.
Răzvan Flavius ​​Panda

9
Câu trả lời tốt, nhưng hãy cẩn thận, các bài kiểm tra trạng thái tài liệu không đợi các bài kiểm tra trước kết thúc.
ROX

Điều thú vị là, theo kinh nghiệm của tôi, nếu chúng ta thêm các thuộc tính Kiểm tra và Đặt hàng một cách riêng biệt, thì không có gì đảm bảo cho việc sắp xếp các bài kiểm tra.
AT

22

Muốn các bài kiểm tra chạy theo một thứ tự cụ thể không có nghĩa là các bài kiểm tra phụ thuộc vào nhau - tôi đang làm việc trong một dự án TDD vào lúc này và là một TDDer giỏi, tôi đã chế giễu / khai man mọi thứ, nhưng nó sẽ làm nó dễ đọc hơn nếu tôi có thể chỉ định thứ tự hiển thị kết quả kiểm tra - theo chủ đề thay vì theo bảng chữ cái. Cho đến nay, điều duy nhất tôi có thể nghĩ đến là thêm a_ b_ c_ vào các lớp vào các lớp, không gian tên và phương thức. (Không đẹp) Tôi nghĩ thuộc tính [TestOrderAttribute] sẽ rất hay - không phải tuân theo khuôn khổ một cách nghiêm khắc, nhưng là một gợi ý để chúng ta có thể đạt được điều này


10

Bất kể việc Kiểm tra có phụ thuộc vào thứ tự hay không ... một số người trong chúng ta chỉ muốn kiểm soát mọi thứ theo một cách có trật tự.

Các bài kiểm tra đơn vị thường được tạo theo thứ tự phức tạp. Vì vậy, tại sao chúng không nên được chạy theo thứ tự phức tạp, hoặc thứ tự mà chúng được tạo ra?

Cá nhân tôi muốn xem các bài kiểm tra chạy theo thứ tự mà tôi đã tạo chúng. Trong TDD, mỗi bài kiểm tra liên tiếp đương nhiên sẽ phức tạp hơn và mất nhiều thời gian hơn để chạy. Tôi muốn xem thử nghiệm đơn giản hơn thất bại trước vì nó sẽ là một chỉ báo tốt hơn về nguyên nhân của sự thất bại.

Tuy nhiên, tôi cũng có thể thấy lợi ích của việc chạy chúng theo thứ tự ngẫu nhiên, đặc biệt nếu bạn muốn kiểm tra rằng các bài kiểm tra của bạn không có bất kỳ sự phụ thuộc nào vào các bài kiểm tra khác. Làm thế nào về việc thêm một tùy chọn cho người chạy thử vào "Chạy thử nghiệm ngẫu nhiên cho đến khi dừng"?


9

Tôi đang thử nghiệm với Selenium trên một trang web khá phức tạp và toàn bộ bộ thử nghiệm có thể chạy trong hơn nửa giờ và tôi vẫn chưa hoàn thành toàn bộ ứng dụng. Nếu tôi phải đảm bảo rằng tất cả các biểu mẫu trước đó được điền chính xác cho mỗi bài kiểm tra, thì điều này sẽ tăng thêm rất nhiều thời gian, không chỉ một lượng nhỏ thời gian cho bài kiểm tra tổng thể. Nếu có quá nhiều chi phí để chạy các bài kiểm tra, mọi người sẽ không chạy chúng thường xuyên.

Vì vậy, tôi sắp xếp chúng theo thứ tự và phụ thuộc vào các bài kiểm tra trước đó để có các hộp văn bản và hoàn thành như vậy. Tôi sử dụng Assert.Ignore () khi các điều kiện trước không hợp lệ, nhưng tôi cần để chúng chạy theo thứ tự.


1
Tổng cộng. Tôi ở cùng thuyền ở đây.
Sleeper Smith

Tôi cũng vậy! Chính xác tại sao tôi lại đặt câu hỏi này!
Niklas Wulff

@NiklasRingdahl nếu bạn đang sử dụng visual studio với nunit, hãy kết xuất nunit và sử dụng thử nghiệm MS. sau đó bạn có thể sử dụng tập tin orderedtest visual studio để sắp xếp trường hợp kiểm tra theo thứ tự bạn muốn họ thực hiện
Rahul Lodha

@RahulLodha Cảm ơn! Tôi sẽ nhìn vào đó.
Niklas Wulff

9

Tôi thực sự thích câu trả lời trước.

Tôi đã thay đổi nó một chút để có thể sử dụng thuộc tính để đặt phạm vi đơn hàng:

namespace SmiMobile.Web.Selenium.Tests
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using NUnit.Framework;

    public class OrderedTestAttribute : Attribute
    {
        public int Order { get; set; }


        public OrderedTestAttribute(int order)
        {
            Order = order;
        }
    }

    public class TestStructure
    {
        public Action Test;
    }

    class Int
    {
        public int I;
    }

    [TestFixture]
    public class ControllingTestOrder
    {
        private static readonly Int MyInt = new Int();

        [TestFixtureSetUp]
        public void SetUp()
        {
            MyInt.I = 0;
        }

        [OrderedTest(0)]
        public void Test0()
        {
            Console.WriteLine("This is test zero");
            Assert.That(MyInt.I, Is.EqualTo(0));
        }

        [OrderedTest(2)]
        public void ATest0()
        {
            Console.WriteLine("This is test two");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
        }


        [OrderedTest(1)]
        public void BTest0()
        {
            Console.WriteLine("This is test one");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
        }

        [OrderedTest(3)]
        public void AAA()
        {
            Console.WriteLine("This is test three");
            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
        }


        [TestCaseSource(sourceName: "TestSource")]
        public void MyTest(TestStructure test)
        {
            test.Test();
        }

        public IEnumerable<TestCaseData> TestSource
        {
            get
            {
                var assembly =Assembly.GetExecutingAssembly();
                Dictionary<int, List<MethodInfo>> methods = assembly
                    .GetTypes()
                    .SelectMany(x => x.GetMethods())
                    .Where(y => y.GetCustomAttributes().OfType<OrderedTestAttribute>().Any())
                    .GroupBy(z => z.GetCustomAttribute<OrderedTestAttribute>().Order)
                    .ToDictionary(gdc => gdc.Key, gdc => gdc.ToList());

                foreach (var order in methods.Keys.OrderBy(x => x))
                {
                    foreach (var methodInfo in methods[order])
                    {
                        MethodInfo info = methodInfo;
                        yield return new TestCaseData(
                            new TestStructure
                                {
                                    Test = () =>
                                        {
                                            object classInstance = Activator.CreateInstance(info.DeclaringType, null);
                                            info.Invoke(classInstance, null);
                                        }
                                }).SetName(methodInfo.Name);
                    }
                }

            }
        }
    }
}

Tôi nghĩ rằng cách tiếp cận này là tuyệt vời. Xin lưu ý rằng mã phản chiếu sẽ kéo tất cả các phương thức có thuộc tính, vì vậy nếu bạn đang cố gắng chạy một bộ cố định thử nghiệm cụ thể, bạn có thể ngạc nhiên khi thấy rằng nó chạy nhiều hơn bạn nghĩ. Bạn có thể dễ dàng sửa đổi truy vấn LINQ nếu đây không phải là hành vi mong muốn. Xem các liên kết trong câu trả lời của tôi để biết thêm thông tin.
Chrispy

OrderedTestkhông còn được hỗ trợ trong NUnit 3
Conrad

7

Tôi biết đây là một bài viết tương đối cũ, nhưng đây là một cách khác để giữ cho bài kiểm tra của bạn có thứ tự mà KHÔNG làm cho tên bài kiểm tra khó xử. Bằng cách sử dụng thuộc tính TestCaseSource và đối tượng bạn chuyển vào có một đại diện (Hành động), bạn hoàn toàn có thể không chỉ kiểm soát thứ tự mà còn đặt tên cho thử nghiệm đó là gì.

Điều này hoạt động bởi vì, theo tài liệu, các mục trong bộ sưu tập được trả về từ nguồn kiểm tra sẽ luôn thực thi theo thứ tự được liệt kê.

Đây là bản demo từ bài thuyết trình mà tôi sẽ trình bày vào ngày mai:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;

namespace NUnitTest
{
    public class TestStructure
    {
        public Action Test;
    }

    class Int
    {
        public int I;
    }

    [TestFixture]
    public class ControllingTestOrder
    {
        private static readonly Int MyInt= new Int();

        [TestFixtureSetUp]
        public void SetUp()
        {
            MyInt.I = 0;
        }

        [TestCaseSource(sourceName: "TestSource")]
        public void MyTest(TestStructure test)
        {
            test.Test();
        }

        public IEnumerable<TestCaseData> TestSource
        {
            get
            {
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test one");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(1));
                        }
                    }).SetName(@"Test One");
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test two");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(2));
                        }
                    }).SetName(@"Test Two");
                yield return new TestCaseData(
                    new TestStructure
                    {
                        Test = () =>
                        {
                            Console.WriteLine("This is test three");
                            MyInt.I++; Assert.That(MyInt.I, Is.EqualTo(3));
                        }
                    }).SetName(@"Test Three");
            }
        }
    }
}

Tôi sử dụng mẫu này cho các bài kiểm tra tích hợp song song sẽ tốn quá nhiều thời gian để chạy tuyến tính. Tất cả các bài kiểm tra đều thuộc một loại vì vậy tôi sử dụng một Hành động <T in> và mọi Hành động đều có một khóa cho biết chức năng "ShouldBeFoo" là gì. Bằng cách này, những gì kiểm tra thực hiện sẽ hiển thị trong tên kiểm tra và TestCaseSource có thể được lọc để các loại kiểm tra khác nhau được nhóm lại với nhau. Trớ trêu thay, tôi không quan tâm đến thứ tự thực hiện, nhưng đồng ý rằng nó sẽ hoạt động.
Novaterata

Sử dụng nó TestCaseSourcenhư một cách để chạy các bài kiểm tra theo thứ tự là một đột phá của thiên tài. Làm tốt. Tôi đã thực hiện phương pháp này cùng với phương pháp bên dưới và thêm một số sửa đổi bổ sung để làm cho nó dễ sử dụng hơn. Xem các liên kết trong câu trả lời của tôi để biết thêm thông tin, nhưng ý tưởng cơ bản là từ câu trả lời tuyệt vời này!
Chrispy

Đáng buồn thay, với NUnit 3, nguồn của TestCaseSourcephải ở trạng thái tĩnh, loại trừ việc sử dụng mẫu. Bummer.
Conrad

@Conrad. Tôi không thấy sự khác biệt làm cho phương thức tĩnh hay không tạo ra. Bài kiểm tra vẫn trở lại theo thứ tự theo cả hai cách.
Dave Bush

Nó không phải là phương thức cần phải tĩnh - nguồn (biến hoặc thuộc tính) của TestCaseSourcephải là một đối tượng tĩnh trong NUnit 3, nếu không các bài kiểm tra sẽ không thực thi. Và bạn không thể tạo các đối tượng động trong một đối tượng tĩnh. Đó là lý do tại sao nó sẽ không hoạt động trong câu 3.
Conrad

5

Tôi đang làm việc với các trường hợp kiểm tra giao diện người dùng đầu cuối của Selenium WebDriver được viết bằng C #, được chạy bằng khung NUnit. (Không phải các trường hợp đơn vị như vậy)

Các bài kiểm tra giao diện người dùng này chắc chắn phụ thuộc vào thứ tự thực hiện, vì các bài kiểm tra khác cần thêm một số dữ liệu như một điều kiện tiên quyết. (Không thể thực hiện các bước trong mọi thử nghiệm)

Bây giờ, sau khi thêm trường hợp thử nghiệm thứ 10, tôi thấy NUnit muốn chạy theo thứ tự sau: Test_1 Test_10 Test_2 Test_3 ..

Vì vậy, tôi đoán bây giờ tôi phải sắp xếp theo thứ tự bảng chữ cái các tên trường hợp thử nghiệm, nhưng sẽ rất tốt nếu tính năng nhỏ này kiểm soát thứ tự thực thi được thêm vào NUnit.


9
Không đồng ý với Arran: Kiểm tra giao diện người dùng vốn dĩ là chuỗi các bước nhỏ. Mỗi bước sẽ là một bài kiểm tra (Lý do - nếu thất bại, tôi cần biết bước nào). Các trình tự có thể độc lập, nhưng trong một trình tự, các vấn đề về thứ tự và dừng lại khi thất bại là cần thiết.
Zasz

3

Thông thường Unit Test phải độc lập, nhưng nếu phải, bạn có thể đặt tên các phương thức của mình theo thứ tự bảng chữ cái, ví dụ:

[Test]
public void Add_Users(){}

[Test]
public void Add_UsersB(){}

[Test]
public void Process_Users(){}

hoặc bạn có thể làm ..

        private void Add_Users(){}

        private void Add_UsersB(){}

        [Test]
        public void Process_Users()
        {
           Add_Users();
           Add_UsersB();
           // more code
        }

2
Ngoại trừ bây giờ các tên phải được đặt theo thứ tự bảng chữ cái, đó là một giải pháp tồi tệ. :(

@ user166390 - không phải là quá tệ. Nó hoạt động và phụ thuộc vào hành vi được ghi lại của NUnit.
tymtam

➕1 đủ tốt cho tôi, dễ dàng hơn nhiều nếu bạn bắt đầu thử nghiệm của bạn với a_ b_ t1_, t2_thay vào đó hoặc dựa vào dễ dàng bỏ lỡ nhân vật trailing
Chris Marisic

3

Có những lý do chính đáng để sử dụng cơ chế Đặt hàng thử nghiệm. Hầu hết các bài kiểm tra của riêng tôi đều sử dụng phương pháp thực hành tốt như thiết lập / xé nhỏ. Những người khác yêu cầu một lượng lớn dữ liệu thiết lập, sau đó có thể được sử dụng để kiểm tra một loạt các tính năng. Cho đến nay, tôi đã sử dụng các bài kiểm tra lớn để xử lý các bài kiểm tra tích hợp (Selenium Webdriver) này. Tuy nhiên, tôi nghĩ bài đăng được đề xuất ở trên trên https://github.com/nunit/docs/wiki/Order-Attribute có rất nhiều điểm đáng khen. Dưới đây là một ví dụ về lý do tại sao đặt hàng sẽ cực kỳ có giá trị:

  • Sử dụng Selenium Webdriver để chạy thử nghiệm tải xuống báo cáo
  • Trạng thái của báo cáo (cho dù báo cáo có thể tải xuống hay không) được lưu vào bộ nhớ đệm trong 10 phút
  • Điều đó có nghĩa là, trước mỗi lần kiểm tra, tôi cần đặt lại trạng thái báo cáo và sau đó đợi tối đa 10 phút trước khi trạng thái được xác nhận là đã thay đổi, sau đó xác minh tải xuống báo cáo chính xác.
  • Các báo cáo không thể được tạo một cách thiết thực / kịp thời thông qua chế độ giả lập hoặc bất kỳ cơ chế nào khác trong khuôn khổ thử nghiệm do tính phức tạp của chúng.

Thời gian chờ 10 phút này làm chậm bộ thử nghiệm. Khi bạn nhân những độ trễ tương tự vào bộ nhớ đệm trong vô số thử nghiệm, nó sẽ tiêu tốn rất nhiều thời gian. Kiểm tra theo thứ tự có thể cho phép thiết lập dữ liệu được thực hiện dưới dạng "Kiểm tra" ngay khi bắt đầu bộ thử nghiệm, với các thử nghiệm dựa vào bộ nhớ đệm để phá vỡ được thực hiện vào cuối quá trình chạy thử nghiệm.


2

Câu hỏi này thực sự đã cũ rồi, nhưng đối với những người có thể tiếp cận câu hỏi này từ việc tìm kiếm, tôi đã lấy các câu trả lời tuyệt vời từ user3275462 và PvtVandals / Rico và thêm chúng vào kho lưu trữ GitHub cùng với một số bản cập nhật của riêng tôi. Tôi cũng đã tạo một bài đăng trên blog được liên kết với một số thông tin bổ sung mà bạn có thể xem để biết thêm thông tin.

Hy vọng điều này sẽ hữu ích cho tất cả các bạn. Ngoài ra, tôi thường thích sử dụng thuộc tính Category để phân biệt các bài kiểm tra tích hợp hoặc các bài kiểm tra end-to-end khác với các bài kiểm tra đơn vị thực tế của tôi. Những người khác đã chỉ ra rằng các bài kiểm tra đơn vị không nên có sự phụ thuộc vào thứ tự, nhưng các loại thử nghiệm khác thường có, vì vậy điều này cung cấp một cách hay để chỉ chạy danh mục thử nghiệm bạn muốn và cũng sắp xếp các bài kiểm tra đầu cuối đó.


bạn có thể giúp tôi một vấn đề mà tôi gặp phải, đây là liên kết: stackoverflow.com/questions/31281395/…
Morgan Soren,

1

Tôi ngạc nhiên vì cộng đồng NUnit không nghĩ ra bất cứ thứ gì, vì vậy tôi đã tự mình tạo ra một thứ như thế này.

Tôi hiện đang phát triển một thư viện mã nguồn mở cho phép bạn đặt hàng các bài kiểm tra của mình với NUnit. Bạn có thể đặt hàng các thiết bị thử nghiệm và đặt hàng "thông số kỹ thuật thử nghiệm đã đặt hàng".

Thư viện cung cấp các tính năng sau:

  • Xây dựng hệ thống phân cấp thứ tự thử nghiệm phức tạp
  • Bỏ qua các bài kiểm tra tiếp theo nếu một bài kiểm tra theo thứ tự không thành công
  • Thứ tự các phương pháp thử nghiệm của bạn theo thứ tự phụ thuộc thay vì thứ tự số nguyên
  • Hỗ trợ việc sử dụng song song với các bài kiểm tra không theo thứ tự. Các bài kiểm tra không có thứ tự được thực hiện đầu tiên.

Thư viện thực sự được lấy cảm hứng từ cách MSTest kiểm tra việc sắp xếp thứ tự với .orderedtestcác tệp. Hãy xem một ví dụ dưới đây.

[OrderedTestFixture]
public sealed class MyOrderedTestFixture : TestOrderingSpecification {
    protected override void DefineTestOrdering() {
        TestFixture<Fixture1>();

        OrderedTestSpecification<MyOtherOrderedTestFixture>();

        TestFixture<Fixture2>();
        TestFixture<Fixture3>();
    }

    protected override bool ContinueOnError => false; // Or true, if you want to continue even if a child test fails
}

1

Nếu bạn đang sử dụng [TestCase], đối số TestNamecung cấp tên cho kiểm tra.

Nếu không được chỉ định, một tên sẽ được tạo dựa trên tên phương thức và các đối số được cung cấp.

Bạn có thể kiểm soát thứ tự thực hiện kiểm tra như dưới đây:

                    [Test]
            [TestCase("value1", TestName = "ExpressionTest_1")]
            [TestCase("value2", TestName = "ExpressionTest_2")]
            [TestCase("value3", TestName = "ExpressionTest_3")]
            public void ExpressionTest(string  v)
            {
                //do your stuff
            }

Ở đây tôi đã sử dụng "ExpressionTest"hậu tố tên phương thức với một số.

Bạn có thể sử dụng bất kỳ tên nào được sắp xếp theo thứ tự bảng chữ cái, xem Thuộc tính TestCase


0

Bạn không nên phụ thuộc vào thứ tự mà khung thử nghiệm chọn các thử nghiệm để thực thi.Các bài kiểm tra nên được tách biệt và độc lập. Trong đó họ không nên phụ thuộc vào một số thử nghiệm khác để tạo tiền đề cho họ hoặc dọn dẹp sau họ. Chúng cũng phải tạo ra cùng một kết quả bất kể thứ tự thực hiện các thử nghiệm (đối với một ảnh chụp nhanh nhất định của SUT)

Tôi đã làm một chút về googling. Như thường lệ, một số người đã sử dụng các thủ thuật lén lút (thay vì giải quyết vấn đề cơ bản về khả năng kiểm tra / thiết kế

  • đặt tên các bài kiểm tra theo thứ tự bảng chữ cái sao cho các bài kiểm tra xuất hiện theo thứ tự mà chúng 'cần' được thực hiện. Tuy nhiên NUnit có thể chọn thay đổi hành vi này với bản phát hành sau đó và sau đó các bài kiểm tra của bạn sẽ được xử lý. Kiểm tra tốt hơn trong các tệp nhị phân NUnit hiện tại để Kiểm soát nguồn.
  • VS (IMHO khuyến khích hành vi sai bằng 'các công cụ nhanh nhẹn' của họ) có một cái gì đó được gọi là "Thử nghiệm có thứ tự" trong khung thử nghiệm MS của họ. Tôi không lãng phí thời gian để đọc nhưng có vẻ như nó được nhắm mục tiêu đến cùng một đối tượng

Xem Thêm: đặc điểm của một bài kiểm tra tốt


Có những trường hợp bạn muốn các thử nghiệm chạy nhanh hơn được thực thi trước khi các thử nghiệm chạy dài, đặc biệt là trong các thử nghiệm tích hợp và chấp nhận. Ví dụ: trong một ứng dụng viết blog: bạn kiểm tra đăng nhập trước, bởi vì nếu tính năng đó không hoạt động, thì việc đăng bài cũng sẽ không hoạt động, do đó không có ích gì khi thực hiện kiểm tra đó (bạn có thể dừng người chạy theo cách thủ công). Nhưng nếu bạn cố gắng tiếp tục chạy thử nghiệm, thì sẽ mất nhiều thời gian hơn.
Marcel Valdez Orozco

@MarcelValdezOrozco - bạn có thể đạt được mục tiêu đó bằng cách phân vùng các thử nghiệm của mình thông qua các dll vật lý khác nhau hoặc bằng cách sử dụng các thẻ / danh mục. Bạn có thể tạo các tập lệnh xây dựng của mình để chạy các dlls / category theo thứ tự. Nói chung, việc cho phép thứ tự các bài kiểm tra thường dẫn đến các bài kiểm tra kết hợp phát triển sự phụ thuộc vào các bài kiểm tra lân cận (tất nhiên là theo thời gian). AFAIR trong bản phát hành lớn tiếp theo của NUnit, nó sẽ hỗ trợ các thứ tự thử nghiệm khác nhau, ví dụ: ngẫu nhiên, v.v.
Gishu

2
Việc phân vùng thêm cùng một loại kiểm thử (ví dụ: kiểm thử chấp nhận) không có ý nghĩa gì và việc tách chúng thành một DLL khác làm tăng độ phức tạp một cách không cần thiết ở mọi nơi: mã nguồn, xây dựng tập lệnh, tập lệnh thử nghiệm, cấu trúc dự án, v.v. Chỉ để thực hiện sắp xếp lại đơn giản Các bài kiểm tra.
Marcel Valdez Orozco

Phát ra (vì vậy về cơ bản là tất cả những lời nói nhảm nhí) là lý do tại sao trật tự sẽ quan trọng. Bạn không thể dỡ bỏ miền ứng dụng của mình và trình chạy nunit (nếu chạy tất cả các thử nghiệm trong một assembly) giữ miền đó cho tất cả các thử nghiệm trong ít nhất là 'fixure' đó. Nếu một bài kiểm tra tạo ra một kiểu để kiểm tra thứ gì đó và một bài kiểm tra khác xung đột với kiểu đã tạo đó, do thứ tự, thì đó không phải là một bài kiểm tra bị lỗi. Chúng bị cô lập về mặt logic, chỉ là nUnit không cung cấp sự cách ly thích hợp giữa mỗi 'bài kiểm tra'.
Kelly Elton

6
Đây là một câu trả lời khá nghiêm khắc và nó khiến nó buồn cười vì nó thực sự chỉ áp dụng cho các bài kiểm tra đơn vị và hoàn toàn bỏ qua việc thực dụng.
tymtam

0

Trong trường hợp sử dụng TestCaseSourcekhóa là override string ToStringphương thức, Cách hoạt động:

Giả sử bạn có lớp TestCase

public class TestCase
{
    public string Name { get; set; }
    public int Input { get; set; }
    public int Expected { get; set; }
}

Và danh sách các TestCases:

private static IEnumerable<TestCase> TestSource()
{
    return new List<TestCase>
    {
        new TestCase()
        {
           Name = "Test 1",
           Input = 2,
           Expected = 4
        },
        new TestCase()
        {
            Name = "Test 2",
            Input = 4,
            Expected = 16
        },
        new TestCase()
        {
            Name = "Test 3",
            Input = 10,
            Expected = 100
        }
    };
}

Bây giờ, hãy sử dụng nó với một phương pháp Kiểm tra và xem điều gì sẽ xảy ra:

[TestCaseSource(nameof(TestSource))]
public void MethodXTest(TestCase testCase)
{
    var x = Power(testCase.Input);
    x.ShouldBe(testCase.Expected);
}

Điều này sẽ không kiểm tra theo thứ tự và đầu ra sẽ như thế này:

nhập mô tả hình ảnh ở đây

Vì vậy, nếu chúng tôi thêm vào override string ToStringlớp của mình như:

public class TestCase
{
    public string Name { get; set; }
    public int Input { get; set; }
    public int Expected { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

Kết quả sẽ thay đổi và chúng tôi nhận được thứ tự và tên của bài kiểm tra như:

nhập mô tả hình ảnh ở đây

Ghi chú:

  1. Đây chỉ là ví dụ minh họa cách lấy tên và thứ tự trong bài kiểm tra, thứ tự được lấy theo số / chữ cái, vì vậy nếu bạn có hơn mười bài kiểm tra, tôi khuyên bạn nên làm Bài kiểm tra 01, Bài kiểm tra 02 .... Bài kiểm tra 10, Bài kiểm tra 11, v.v. bạn làm Test 1 và đến một lúc nào đó Test 10 hơn thứ tự sẽ là Test 1, Test 10, Test 2 ..v.v.
  2. Đầu vào và Dự kiến ​​có thể là bất kỳ kiểu, chuỗi, đối tượng hoặc lớp tùy chỉnh nào.
  3. Bên cạnh thứ tự, điều tốt ở đây là bạn thấy tên thử nghiệm quan trọng hơn.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.