문제

내 유닛 테스트 중 하나가 실행할 때 무작위로 통과하거나 실패하는 것처럼 보입니다.이것이 일어나는 이유에 대해 나에게 이해가되는 유일한 것은 테스트가 실행될 때마다 데이터베이스의 데이터가 다른 상태로 들어갑니다.하지만 각 테스트에서 데이터베이스를 롤백하기 위해 트랜잭션을 사용합니다....에다음은 내 기본 단위 테스트 클래스와 문제가있는 장치 테스트 클래스입니다.내가 누락되었을지도 모르는 것을 볼 수 있거나 무엇을 찾아야 하는지를 볼 수 있습니까?

TestDriven.net Visual Studio Unit 테스트 프레임 워크에서 발생합니다.

Partial Public MustInherit Class TestBase

    Private _scope As Transactions.TransactionScope

    <DebuggerStepThrough()> _
    <TestInitialize()> _
    Public Sub Setup()

            //'Start the Distribution Transaction Coordinator, if it's not already running.
            Using dtcService As New System.ServiceProcess.ServiceController("Distributed Transaction Coordinator", My.Computer.Name)
                    If dtcService.Status = ServiceProcess.ServiceControllerStatus.Stopped Then
                            dtcService.Start()
                    End If
            End Using

            _scope = New TransactionScope(TransactionScopeOption.RequiresNew, New TimeSpan(0))
    End Sub

    <DebuggerStepThrough()> _
    <TestCleanup()>
    Public Sub Teardown()
        If _scope IsNot Nothing Then
            _scope.Dispose()
        End If
    End Sub

    <System.Diagnostics.DebuggerStepThrough()> _
    Public Shared Function ExecSql(ByVal sql As String) As System.Data.DataTable

        Dim connStr = GlobalSettings.GetConnectionString()
        Using conn As New System.Data.SqlClient.SqlConnection(connStr)
            conn.Open()

            Dim cmd As New System.Data.SqlClient.SqlCommand(sql.ToString, conn)
            Dim adapter As System.Data.SqlClient.SqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter(cmd)
            Dim dt As System.Data.DataTable = New System.Data.DataTable
            adapter.Fill(dt)

            Return dt

            If conn.State <> System.Data.ConnectionState.Closed Then
                conn.Close()
            End If
            conn.Dispose()
        End Using
    End Function
End Class
.

여기에 내 단위 테스트가 있습니다 :

Partial Public Class CampaignEmailSendLimitServiceTests
    Inherits TestBase

    Private _service = ServiceManager.Current.MyService

    <TestMethod()> _
    Public Sub MyTest()
        //' Set the pre-test condition.
        ExecSql("update base.dbo.tblTableA set someDate = '2010-06-28' where id = 56937 ")

        //' Run the service
        _service.Process()

       //' Verify the expected result
       Dim dt = ExecSql("select deliveryDate from tblTableB ")
       Assert.AreEqual(False, dt.Rows(0).IsNull("deliveryDate"))

    End Sub
End Class
.

도움이 되었습니까?

해결책 3

나는 마침내 무슨 일이 일어나고 있는지 알아 냈습니다.그것은 거래와 아무 관련이 없습니다.그게 다 멋지다.그것은 디자인에 의해 일관성없는 행동을 창출하는 것이 나의 과정이었습니다.발견 된 다른 순위가없는 경우 납기를 결정하기 위해 "임의 순위"가있는 프로세스의 일부가있었습니다.단위 테스트는 비즈니스 규칙을보다 잘 반영하도록 재 작성되어야합니다.

다른 팁

이것은 항상 나를 위해 잘 작동했습니다.내가 본 주된 차이점은 transactionscopeoption.required를 사용하는 것입니다.

[TestClass()]
public class MyTest: DatabaseTestClass
{

    public MyTest()
    {
        InitializeComponent();
    }

    TransactionScope ambientTransaction;

    [TestInitialize()]
    public void TestInitialize()
    {
        ambientTransaction = new TransactionScope(TransactionScopeOption.Required);
        base.InitializeTest();
    }

    [TestCleanup()]
    public void TestCleanup()
    {
        ambientTransaction.Dispose();
        base.CleanupTest();
    }
}
.

DataAdapter.Fill을 사용하여 업데이트를 실행하는 이유는 무엇입니까?SELECT 문을 사용하여 DATATABLES를 채우도록 설계되었습니다.

내 추측은 처음에는 ExecSQL을 사용하여 데이터베이스에 아무 것도 쓸 수 없다는 것입니다.

및 두 번째 일.이 주장은 가능한 한 읽을 수없는 것입니다. 나는 를 바꿀 것이다

Assert.AreEqual(False, dt.Rows(0).IsNull("deliveryDate"));
.

~

Assert.IsFalse(dt.Rows(0).IsNull("deliveryDate"));
.

또는

Assert.That(dt.Rows(0)("deliveryDate"), Is.Not.Null));
.

읽을 수없는 테스트는 사용자가 당신을 늦추기 때문에 단위 테스트가 나쁘다고 말하는 이유 중 하나입니다.가능한 한 읽고 이해하기 쉽고 단위 테스트를해야합니다.단위 테스트에 대한 주장이 없으므로)

VB.NET을 사용하지 않는 것처럼 몇 가지 오타가있을 수 있습니다.주장 된 예제는 nunit의 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top