John Sibly
그는 물었다 12년 전
37

아무런 성공한 적이 유닛 테스트 SQL 저장 프로시저?

이번 연구에서는 유닛 테스트 코드를 C # 의 까지하네 까지하네 기록되었으므로 /C++ 정말로 지불됨 끄기입니다. 그래도 아직 수천 개의 사업부 논리는 저장 프로시저, 정말로 우리 제품은 할 때 사용할 수 있어 in anger 테스트되었습니다 롤아웃할 사용자 수가 많은.

이 중 일부는 더 어떨거라고 에로남이네 저장 프로시저 끝날 때 성능 저하가 반군지역 임시 테이블 때문에 매우 오랜 기간 중인 sp 간. 이 때문에 우리를 막을 수 있도록 코드를 리팩토링 에서 간단해진다는.

우리는 우리의 주요 건물 중 일부는 예증의표적으로 시도는 여러 유닛 테스트 수립하였습니다 저장 프로시저 (주로 성능 테스트) 가 있는데, 이 테스트를 위해 정말 열심히 테스트 데이터를 셋업하기 있다는 것을 발견했다. 예를 들어, 복사 수립하였습니다 왔냐는 테스트) 이다. 이 외에도 테스트가 다니엘을 변경하십시오 정말 중요한 것, 심지어 가장 작은 변경할 저장됩니까 proc. 많은 양의 변경 또는 테이블 单捞磐啊 테스트를 진행중이다. 이러한 데이터베이스 구축 테스트를 해 이후 간헐적으로 인해 많은 깨고 못하고 그냥 당겨 빼냅니다 빌드 프로세스는 까지하네 했다.

따라서 주요 부분은 내 질문을합니다 입니다. 유닛 테스트 장비에 대한 판매업체에서 성공적으로 기록된 적이 저장 프로시저?

두 번째 부분은 과연 내 질문에 유닛 테스트 약간만이라도 / 쉽게 linq?

제 생각에 설정할 수 있는 테이블을 간단히 만들 수 있는 것보다 테스트 데이터를 수집 및 테스트 테스트 오브젝트에도 너회의 linq 코드에서 "linq 객체" 말했다. (나는 완전히 새로운 일을 전혀 안 해도 될 것 "이라며" 그래서 linq 다운로드되었는지 이)

답변 16 개

나는 내가 만든 것으로 이 같은 문제로 분할합니다 실행했음 뒤로를 경우 간단한 요약 및 귈이예요 베이스 클래스를 연결 및 거래, 나는 할 수 있는 데이터를 액세스하도록 투입할 수 있는 나를 볼 수 있는 한 나는 내 스페로치 단위 테스트 SQL 작업하십시오 달라고 할 경우 다음 롤백에서 하나도 남아 있어 테스트 데이터가 db.

평소보다 더 잘 &quot 실행하십시오 설치, 이 후 테스트를 수행하는 실행하십시오 클린업합니다 스크립트입니다 내 db 테스트, 정크 / 테스트 data". 또한 더 가깝게 느낄 수 있기 때문에 이러한 테스트는 유닛 테스트를 혼자 있으면 엄청난 규모의 db 에 있는 모든 실행하십시오 w / 아웃해야 &quot # 39, & # 39, 그냥 so& 합니다. 이 전 실행하십시오 tests".

  • 이것은 추상 기본 클래스 activcard 스니핏 의 데이터를 액세스하도록 *

Public MustInherit Class Repository(Of T As Class)
    Implements IRepository(Of T)

    Private mConnectionString As String = ConfigurationManager.ConnectionStrings("Northwind.ConnectionString").ConnectionString
    Private mConnection As IDbConnection
    Private mTransaction As IDbTransaction

    Public Sub New()
        mConnection = Nothing
        mTransaction = Nothing
    End Sub

    Public Sub New(ByVal connection As IDbConnection, ByVal transaction As IDbTransaction)
        mConnection = connection
        mTransaction = transaction
    End Sub

    Public MustOverride Function BuildEntity(ByVal cmd As SqlCommand) As List(Of T)

    Public Function ExecuteReader(ByVal Parameter As Parameter) As List(Of T) Implements IRepository(Of T).ExecuteReader
        Dim entityList As List(Of T)
        If Not mConnection Is Nothing Then
            Using cmd As SqlCommand = mConnection.CreateCommand()
                cmd.Transaction = mTransaction
                cmd.CommandType = Parameter.Type
                cmd.CommandText = Parameter.Text
                If Not Parameter.Items Is Nothing Then
                    For Each param As SqlParameter In Parameter.Items
                        cmd.Parameters.Add(param)
                    Next
                End If
                entityList = BuildEntity(cmd)
                If Not entityList Is Nothing Then
                    Return entityList
                End If
            End Using
        Else
            Using conn As SqlConnection = New SqlConnection(mConnectionString)
                Using cmd As SqlCommand = conn.CreateCommand()
                    cmd.CommandType = Parameter.Type
                    cmd.CommandText = Parameter.Text
                    If Not Parameter.Items Is Nothing Then
                        For Each param As SqlParameter In Parameter.Items
                            cmd.Parameters.Add(param)
                        Next
                    End If
                    conn.Open()
                    entityList = BuildEntity(cmd)
                    If Not entityList Is Nothing Then
                        Return entityList
                    End If
                End Using
            End Using
        End If

        Return Nothing
    End Function
End Class

  • 이제 위의 기본 데이터 액세스 샘플링합니다 사용하여 클래스를 볼 수 있는 제품 목록을 *

Public Class ProductRepository
    Inherits Repository(Of Product)
    Implements IProductRepository

    Private mCache As IHttpCache

    'This const is what you will use in your app
    Public Sub New(ByVal cache As IHttpCache)
        MyBase.New()
        mCache = cache
    End Sub

    'This const is only used for testing so we can inject a connectin/transaction and have them roll'd back after the test
    Public Sub New(ByVal cache As IHttpCache, ByVal connection As IDbConnection, ByVal transaction As IDbTransaction)
        MyBase.New(connection, transaction)
        mCache = cache
    End Sub

    Public Function GetProducts() As System.Collections.Generic.List(Of Product) Implements IProductRepository.GetProducts
        Dim Parameter As New Parameter()
        Parameter.Type = CommandType.StoredProcedure
        Parameter.Text = "spGetProducts"
        Dim productList As List(Of Product)
        productList = MyBase.ExecuteReader(Parameter)
        Return productList
    End Function

    'This function is used in each class that inherits from the base data access class so we can keep all the boring left-right mapping code in 1 place per object
    Public Overrides Function BuildEntity(ByVal cmd As System.Data.SqlClient.SqlCommand) As System.Collections.Generic.List(Of Product)
        Dim productList As New List(Of Product)
        Using reader As SqlDataReader = cmd.ExecuteReader()
            Dim product As Product
            While reader.Read()
                product = New Product()
                product.ID = reader("ProductID")
                product.SupplierID = reader("SupplierID")
                product.CategoryID = reader("CategoryID")
                product.ProductName = reader("ProductName")
                product.QuantityPerUnit = reader("QuantityPerUnit")
                product.UnitPrice = reader("UnitPrice")
                product.UnitsInStock = reader("UnitsInStock")
                product.UnitsOnOrder = reader("UnitsOnOrder")
                product.ReorderLevel = reader("ReorderLevel")
                productList.Add(product)
            End While
            If productList.Count > 0 Then
                Return productList
            End If
        End Using
        Return Nothing
    End Function
End Class

  • 이제는 단위 테스트 환경에서 매우 간단한 상속됩니다 수도 있습니다 (base class) 를 설치 또는 유지 작업 - 이 / 가 롤백에서 장치당 * 테스트 합니다.

  • 다음은 단순한 테스트를 아이 유즈드 (base class) *

Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.VisualStudio.TestTools.UnitTesting

Public MustInherit Class TransactionFixture
    Protected mConnection As IDbConnection
    Protected mTransaction As IDbTransaction
    Private mConnectionString As String = ConfigurationManager.ConnectionStrings("Northwind.ConnectionString").ConnectionString

    <TestInitialize()> _
    Public Sub CreateConnectionAndBeginTran()
        mConnection = New SqlConnection(mConnectionString)
        mConnection.Open()
        mTransaction = mConnection.BeginTransaction()
    End Sub

    <TestCleanup()> _
    Public Sub RollbackTranAndCloseConnection()
        mTransaction.Rollback()
        mTransaction.Dispose()
        mConnection.Close()
        mConnection.Dispose()
    End Sub
End Class

  • 마지막으로, 아래의 것은 단순한 테스트 테스트 베이스 클래스를 사용하는 방법을 보여 주는 모든 스페로치 자신의 작업을 할 수 있도록 전체 테스트하려면 사이클입니다 침전물 및 해당 코드를 높여줍니까 좌우 구성도를 제대로 * ado.net

  • 39 이 doesn& 그러니까말이야 &quot 테스트하려면, t, spGetProducts&quot. 위의 스페로스 사용되는 데이터 액세스 샘플링합니다 볼 수 있지만, 이 방법을 권세를 뒤로하고 스페로치 유닛 테스트 *

Imports SampleApplication.Library
Imports System.Collections.Generic
Imports Microsoft.VisualStudio.TestTools.UnitTesting

<TestClass()> _
Public Class ProductRepositoryUnitTest
    Inherits TransactionFixture

    Private mRepository As ProductRepository

    <TestMethod()> _
    Public Sub Should-Insert-Update-And-Delete-Product()
        mRepository = New ProductRepository(New HttpCache(), mConnection, mTransaction)
        '** Create a test product to manipulate throughout **'
        Dim Product As New Product()
        Product.ProductName = "TestProduct"
        Product.SupplierID = 1
        Product.CategoryID = 2
        Product.QuantityPerUnit = "10 boxes of stuff"
        Product.UnitPrice = 14.95
        Product.UnitsInStock = 22
        Product.UnitsOnOrder = 19
        Product.ReorderLevel = 12
        '** Insert the new product object into SQL using your insert sproc **'
        mRepository.InsertProduct(Product)
        '** Select the product object that was just inserted and verify it does exist **'
        '** Using your GetProductById sproc **'
        Dim Product2 As Product = mRepository.GetProduct(Product.ID)
        Assert.AreEqual("TestProduct", Product2.ProductName)
        Assert.AreEqual(1, Product2.SupplierID)
        Assert.AreEqual(2, Product2.CategoryID)
        Assert.AreEqual("10 boxes of stuff", Product2.QuantityPerUnit)
        Assert.AreEqual(14.95, Product2.UnitPrice)
        Assert.AreEqual(22, Product2.UnitsInStock)
        Assert.AreEqual(19, Product2.UnitsOnOrder)
        Assert.AreEqual(12, Product2.ReorderLevel)
        '** Update the product object **'
        Product2.ProductName = "UpdatedTestProduct"
        Product2.SupplierID = 2
        Product2.CategoryID = 1
        Product2.QuantityPerUnit = "a box of stuff"
        Product2.UnitPrice = 16.95
        Product2.UnitsInStock = 10
        Product2.UnitsOnOrder = 20
        Product2.ReorderLevel = 8
        mRepository.UpdateProduct(Product2) '**using your update sproc
        '** Select the product object that was just updated to verify it completed **'
        Dim Product3 As Product = mRepository.GetProduct(Product2.ID)
        Assert.AreEqual("UpdatedTestProduct", Product2.ProductName)
        Assert.AreEqual(2, Product2.SupplierID)
        Assert.AreEqual(1, Product2.CategoryID)
        Assert.AreEqual("a box of stuff", Product2.QuantityPerUnit)
        Assert.AreEqual(16.95, Product2.UnitPrice)
        Assert.AreEqual(10, Product2.UnitsInStock)
        Assert.AreEqual(20, Product2.UnitsOnOrder)
        Assert.AreEqual(8, Product2.ReorderLevel)
        '** Delete the product and verify it does not exist **'
        mRepository.DeleteProduct(Product3.ID)
        '** The above will use your delete product by id sproc **'
        Dim Product4 As Product = mRepository.GetProduct(Product3.ID)
        Assert.AreEqual(Nothing, Product4)
    End Sub

End Class

내가 아는 이는 기절해있는 acrobatconnectcentral. 하지만 데 투명지에 재사용 가능한 class 를 데이터 액세스 일이 있고 또 다른 재사용 가능한 클래스 내 테스트 그래서 didn& # 39, 해체 작업을 수행할 수 없는 설정 / 운명인것 다시;)

드베니스 적이 있습니까? # 39 의 it& 위해 거쳐야 할 필요 없이 그냥 데이터베이스에 단위 테스트 및 데이터베이스에 당신의 C # 코드입니다.

테스트 채우는 데 있어 가장 중요한 데이터가 저장 프로시저 쓸 수 있는 데이터베이스를 스크립트입니다 빈 사전에 계획된 아웃해야 발생할 때 일관됨 비헤이비어를 저장 프로시저) 이라고 부른다.

나는 내 마음이 무겁게 비즈니스를 위한 투표를 할 수 있는 논리를 동일팔레트에 저장 프로시저 및 배치 (및 가장 dba) 에 속하는 데이터베이스입니까 나는 것 같아요.

내가 알고 있는 우리는 소프트웨어 엔지니어 등 아름다운 우리 언어, 우리가 좋아하는 스맥랜드의 세이스트 코드, 기록되어 있지만, 중요한 논리를 모두 담을 수 있는 대용량 시스템, 그리고 현실 성능 데이터, 우리를 필요로 하는 중요한 특성을 무결성에 절충안이. Sql 코드를 수 있지만, 내가 그 반복, 하드 테스트하려면 can& 데이터베이스 튜닝 난이도입니다 완벽하게 제어할 수 없이 상상할 t # 39 의 디자인을 질의입니다.

나는 어쩔 수 없이 데이터 모델 등이 종종 완전히 재설계 쿼리합니다 변경되는지 셨으며 에서 실행할 수 있도록 만족스런 시간. 저장 프로시저로, 내가 할 수 있는 저장 프로시저 때문에 대한 변경 사항이 확신시키도록 솔직하십시오 요청자에게 등 뛰어난 캡슐화 제공합니다.

brumScouse
그는 3년 전 댓글을 달았습니다
0

난, 본인의 스나스베르 wern& 조교하실 # 39, t you? 비즈니스 로직 과부하된 사용할 수 있는 것이다. 그럼 어떻게 투석실에다가 통합을 통해 자신의 논리를 스택할 이상의 단위 테스트 테스트? 나는 계속 일을 훨씬 더 단순하고 스페로치 논리 코드의 올리기 성공 했다. 내가 상대한 끔찍한 경험을 통해 터무니없이 네스트된 스페로치 및 기능을 보장하기 위해 모든 비즈니스 로직 삼백년에 DB 에서. 가져다줄래요 감사합니디ᅡ 없습니다.

이런 생각을 하는 경우 유닛 테스트 코드를 프로모트할 경향이 있다. 작은 높은 결합 및 함께 나뉜다 루틴을 관심용 거의 볼 수 있어야 합니다 여기서 최소한 일부 문제가 될 수 있습니다.

내 나오는 world& # 39 의 세계, 저장 프로시저 일부인 RDBMS 오랜 설득 할 수 있도록 하는 업무 처리 데이터베이스로 이동할 수 있는 서버 라이센스 비용을 고려할 때 감지에서 경향이 관련 같은 프로세서입니다 카운트입니다. 데이터베이스 내의 실행할 때, 그들이 하는 물건을 더 많이 있습니다.

하지만 난 # 39 더 관련되어 있으며, 실제로 you& 내려받습니다 인상을, re isn& # 39 의 유닛 테스트를 성능 보존, 정말 전혀 없다. 유닛 테스트 할 수 있어야 하고 핵 및 성능을 상당히 고안되었습니다 아닌 확인할 수 있다. # 39, 거의 확실히 하고, 이런 경우에는 you& 클래스 운영 로드되는지 쿼리하지 견제하기 위해 더 이상 필요 했다.

다른 등급의 테스트 환경에 필요한 것 같아요. # 39 로 i& 가장 간단한 경우, d, t # 39 isn& 운영 복제본을 제안하세요 보안 문제가. 각 후보 릴리스에서는 시작하면 그 이전 버전에서 사용 릴리스에는 마이그레이션해야 절차 (부여하느뇨 좋은 만큼 테스트 그 어떤 부작용을) 너회의 실행하십시오 타이밍.

뭐 그런.

좋은 질문입니다.

나는, 내가 경험한 경로는 이와 비슷한 문제를 최소한의 저항 (for me, 어쨌든).

다른 여러 가지 다른 솔루션을 보유하고 있는 했나요. 대다수가 더 깨끗한 우수 / / 더 적합하다고 한다.

이미 사용하고 있었기 때문에 내가 그냥 내 C #, Testdriven.NET/MbUnit 테스트하려면 각 프로젝트에 사용되는 security. 저장 프로시저 추가되든지 테스트를 하는 app.

I know, I know. 하지만 이 끔찍했네요 어떤 데릭쉐퍼드와 끕니까 some 테스트, 거기서 검색하기를 두고 있습니다. 이 서비스는 낮음입니다 나는 내 비록 외곽진입 있다는 일부 저장됩니까 프로세서 동시에건간에 테스트 테스트 코드를 저들이요 호출하십시오 될 수 있는 as I am 이 논리라구요 있습니다.

Mssql 의 유닛 테스트를 할 때 나는. # 39 에 대한 지원을 고려할 때 몇 가지 한계가 드베니스 it& MSSQL. # 39 이 doesn& t 지원 노바르처, 예를 들어. 몇 가지 문제가 실제 사용자 및 해당 드베니스.

39 만 i&, 똑같은 상황을 오리지널 포스터. 이것은 아래로 비해 성능 테스트. 내 쪽으로 바이어스 () 는 테스트 (make it work, 그냥 빨리합니다 (make it right), 충수염이요 유지할 수 있는 비즈니스 로직 빼냅니다 데이터베이스. 데이터베이스 테스트 코드를 코드 분석 및 탐색 및 구조 등으로 부족한 프레임워크와도 뿐 아니라, Java 언어로 볼 수 있지만, 데이터베이스 등) 도 있어 매우 느린 툴과도 코드 (여기서 매우 부정적 Java 코드를 아니다).

그러나 나는한다 인식하는 능력을 데이터베이스 세트 처리. Sql 코드를 적절히 사용할 경우 일부 믿을 수 없을 정도로 옳은말이지 거의 없이 할 수 있다. 따라서, 일부 설정되었습니다 기반 i& # 39 m ok 살고 있음에도 불구하고 여전히 내가 모든 걸 할 수 있는 논리를 데이터베이스입니까 내아기마저도 단위 테스트 합니다.

아주 길고 절차적 데이터베이스 관련 참고 있는 것 같다, 내가 생각하기에 코드 코드 종종 무언가 증상을 일으키지 않고 성능 저하 등 쓸만한 코드를 변환할 수 있다. 이 가설은 seabreeze 등 자주 사용하는 프로세스가 코드를 배치처리 많은 양의 데이터를 처리할 수 있다. 만약 이러한 프로세스를 실행할 수 있는 실시간 비즈니스 로직을 변환될지 배치처리 있던 작은 청크를 입력 데이터가 변경될 때마다 이 될 수 있는 논리를 실행하십시오 미드레인지 (어디에 테스트 할 수 있습니다) 전환하지 않고 성능 저하 (이후 이 작품은 작은 청크를 완료되어도 실시간으로). 또한 긴 피드백 루프, 일괄 처리 등 부작용을 는. 오류 처리. 물론 이 모든 경우에, t # 39 외곽진입 won& 작업하십시오 작업하십시오 있지만 일부. 또한, 일괄 처리, 데이터베이스 등의 시스템에서 검증 할 경우 만 t 의 코드는 the road to salvation 길고 핍박한 수 있습니다. 이메프.

Visual Studio 에서 데이터베이스 전문가 할 수도 있습니다. It& # 39 의 유닛 테스트 테스트 데이터를 생성할 수 있지만 주로 변경 관리 정보 및 도구) 도 갖고 있다.

39 의 it& 꽤 비싼 수천.

&gt. 하지만 난 # 39 더 관련되어 있으며, 실제로 you& 내려받습니다 인상을, re isn& # 39 의 유닛 테스트를 성능 보존, 정말 전혀 없다. 유닛 테스트 할 수 있어야 하고 핵 및 성능을 상당히 고안되었습니다 아닌 확인할 수 있다. # 39, 거의 확실히 하고, 이런 경우에는 you& 클래스 운영 로드되는지 쿼리하지 견제하기 위해 더 이상 필요 했다.

여기서 두 가지 서로 다른 테스트 등 상당히 생각한다. 성능, 실제 이 논리를 저장 프로시저.

내가 준 예는 과거 및 db 성능 테스트, 다행히 우리는 도달했음 않는 점을 성능 충분합니다.

내가 완전히 동의할 수 있는 상황과 모든 비즈니스 로직 데이터베이스가 나쁜거라 하나, 그러나 it& # 39 의 생각하신거야 we& # 39, ve 상속됩니다 전에 대부분의 개발자들이 참여됨 있다.

그러나 이제 웹 서비스 모델을 채택하고, re we& # 39 의 새로운 기능, we& # 39, ve been 저장 프로시저 최대한 유지하기 위해 노력하고, C # 논리는 발사 코드와 스크라코먼즈 dell. 데이터베이스입니까 (단, linq 다시그것들을 이제 좋은 방법을). 아직 일부 사용할 수 있는 기존 sp 는 왜 내가 생각했던 저들이요 소급 방식으로 유닛 테스트

나는한다 케이블링의 man& # 39 의 유닛 테스트. # 39 는 불과 몇 m 테스트는 I& 경우, 게으른 유효함 호출 수 있는 문제가 있는 매개 변수 값을.

/*

--setup
Declare @foo int Set @foo = (Select top 1 foo from mytable)

--test
execute wish_I_had_more_Tests @foo

--look at rowcounts/look for errors
If @@rowcount=1 Print 'Ok!' Else Print 'Nokay!'

--Teardown
Delete from mytable where foo = @foo
*/
create procedure wish_I_had_more_Tests
as
select....

우리가 사용하는 &lt, http://blogs.ent0.com/files/default.aspx&quot,, a href = &quot &gt DataFresh&lt /a&gt. 각 테스트 테스트 스페로치 롤백하려면 사이의 변경 후 비교적 쉽게 사용할 수 있습니다.

코드 커버리지 툴들은 지정하십시오. 는 여전히 미흡하다.

모든 종류의 데이터 관련 문제는 유닛 테스트 테스트 데이터를 신뢰할 수 있는 프로그래밍 하는 설정되었습니다 시작해야 한다. 또한 복잡한 저장됩니까 프로세서 및 어떤 않니다 많이유 따라 달라집니다. 유닛 테스트 매우 복잡한 것이 매우 어려운 자동화합니다 프로시저입니다 수정날짜 많은 표.

일부 다른 몇 가지 간단한 방법을 설명하고, 또한 일부 도구에서는 자동화합니다 것이라고 포스터 %s/dbase/ext_table. 수동 테스트 SQL Server 에서 사용할 수 있습니다. 측면, PL / SQL guru 를 Oracle PL / SQL 의 무료 저장 프로시저 불렀으매 스티븐 포이어스틴 협력했습니다 유닛 테스트를 위한 도구로 머플스크라.

그러나 그는 그 후 Quest& # 39 의 코드 테스터 작업량의 떨어트림 PL / SQL 의 광고를 함께 갔다. 퀘스트 제공사항 무료로 다운로드할 수 있는 시험 버전. # 39 만 돌파를 눈앞에 두고 있는 것, i& 아웃해야. 내 것이 이해가 잘 돌봐 설정 시 해당 오버헤드에 테스트 프레임워크를 집중할 수 있도록 합니다, 정보기술 (it) 는 스스로 그냥 테스트 테스트 할 수 있도록 그들을 재사용합니다 회귀 테스트 중 하나인 큰 혜택을 테스트 제어됨을 개발. 또, 그 이상 확인 잘 되어야 하는 출력 변수 및 데이터 변경률 검증중 위한 프로비저닝을 없는, 하지만 난 아직 내 자신을 더 자세히 살펴보겠습니다. 이 정보 생각해봤죠 가치 for Oracle 사용자 수 있습니다.

아이고. # 39 도 (자동화됨), t 스페로치 don& 유닛 테스트를 했다. 나는 일종의 &quot 번호장치 test"; 복잡한 내 손을 써서 스페로치 t-sql 배치 파일 및 검사 결과를 인쇄하십시오 테스트를 명령문입니다 및 결과.

한 가지 옵션을 re 계수 코드 (i& # 39 는 그 사실을 인정하고, ll (hack) 를 통해 이를 발령합니다 약간만이라도 cpp (c 언어 전처리기) m4 (배반자들의 노력은 한 것 같습니다) 또는 같은. I have a 프로젝트를 주로 수행하는 작업 및 실제로 것.

유일한 경우 내가 생각할 수 있는 대해 유효함 는 1) 에 대한 대안으로 KLOC+ 저장됩니까 절차 및 2) 그리고 이건 내 경우 점을 알 수 있습니다 (into 미친) 프로젝트는 그동안 누름식 기술.

우리는 C # 단위 테스트 코드를 호출하는 sp. 우리는 청소 테스트 생성 스크립트를 작성할 수 있습니다. 테스트 중에 있으며, 큰 수준들과 저희에게는힘과 부착합니다 분리하십시오 고정장치에. 이 테스트는 시간이 소요될 수 있지만, 그만한 가치가 있다고 생각합니다.

LINQ 는 경우에만 이를 단순화하십시오 분리하십시오 논리를 재구현 정보기술 (it) 을 통해 사용자의 저장 프로시저 및 linq 질의입니다. 될 수 있는 쉽고, 훨씬 더 강력한 테스트하려면 말해둘꼐요. 그러나 이 요구 사항을 대비하기 아니하였으매) 처럼 들린다.

TL; DR: 설계에 문제가 있다.