@ টেস্টের পরে রোলব্যাক লেনদেন


86

প্রথমত, আমি স্ট্যাকওভারফ্লোতে এই সম্পর্কে প্রচুর থ্রেড পেয়েছি, তবে তাদের কেউই আমাকে সত্যিই সহায়তা করেনি, সম্ভবত নকল প্রশ্ন জিজ্ঞাসা করার জন্য দুঃখিত।

আমি স্প্রিং-টেস্ট ব্যবহার করে JUnit পরীক্ষা চালাচ্ছি, আমার কোডটি এমন দেখাচ্ছে

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {})
public class StudentSystemTest {

    @Autowired
    private StudentSystem studentSystem;

    @Before
    public void initTest() {
    // set up the database, create basic structure for testing
    }

    @Test
    public void test1() {
    }    
    ...  
}

আমার সমস্যাটি হ'ল আমি চাই আমার পরীক্ষাগুলি অন্য পরীক্ষাগুলিকে প্রভাবিত না করে। সুতরাং আমি প্রতিটি পরীক্ষার জন্য রোলব্যাকের মতো কিছু তৈরি করতে চাই। আমি এটির জন্য অনেক অনুসন্ধান করেছি, তবে এখনও অবধি কিছুই পাইনি। আমি এটির জন্য হাইবারনেট এবং মাইএসকিএল ব্যবহার করছি


রোলব্যাক বলতে কী বুঝ? ডাটাবেস পরিষ্কার করছেন?
গৌরব

4
মৃত্যুদন্ড কার্যকর করার পরে এটি ঠিক একই স্থানে সেট করেinitTest
জান ভোরকাক

উত্তর:


129

শুধু যোগ @Transactionalআপনার পরীক্ষার উপরে টীকা:

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {"testContext.xml"})
@Transactional
public class StudentSystemTest {

ডিফল্টরূপে বসন্ত আপনার পরীক্ষার পদ্ধতি এবং @Before/ @Afterকলব্যাকগুলি ঘিরে একটি নতুন লেনদেন শুরু করবে , শেষে ফিরে যাবে। এটি ডিফল্টরূপে কাজ করে, প্রসঙ্গে কিছু লেনদেন পরিচালকের পক্ষে যথেষ্ট।

থেকে: 10.3.5.4 লেনদেন পরিচালনা (সাহসী খনি):

টেস্টকন্টেক্সট ফ্রেমওয়ার্কে লেনদেনগুলি ট্রানজেকশনাল টেস্টএক্সেকিউশনলিস্টনার দ্বারা পরিচালিত হয়। লক্ষ্য করুন TransactionalTestExecutionListenerহয় ডিফল্টরূপে কনফিগার , এমনকি যদি আপনি স্পষ্টভাবে ঘোষণা করছে না @TestExecutionListenersআপনার পরীক্ষার বর্গ উপর। লেনদেনের জন্য সমর্থন সক্ষম করতে, তবে আপনাকে শব্দার্থবিজ্ঞান PlatformTransactionManagerদ্বারা লোড করা অ্যাপ্লিকেশন প্রসঙ্গে একটি শিম সরবরাহ করতে হবে @ContextConfiguration। এছাড়াও, আপনার পরীক্ষার জন্য আপনাকে অবশ্যই @Transactionalক্লাস বা পদ্ধতি পর্যায়ে ঘোষণা করতে হবে


4
ভাল, আমি এটি আগে চেষ্টা করেছি, এবং এটি এখনও কাজ করে না, সম্ভবত ... সমস্যাটি হতে পারে যে আমি প্ল্যাটফর্ম ট্রান্সজেকশন ম্যানেজারটি সংজ্ঞায়িত করি নি, আমি কীভাবে এটি করতে পারি?
জান ভোরকাক

@ জাভো: আপনি কীভাবে ডাটাবেসটি পরিবর্তন করছেন? আপনি যদি জেপা / হাইবারনেট / জেডিবিসিটেম্পলেট / ... ব্যবহার করছেন তবে অবশ্যই কিছু থাকতে হবে PlatformTransactionManager। অন্যথায় বসন্ত কীভাবে আপনার লেনদেন এবং ডাটাবেস সম্পর্কে জানবে?
টমাসজ নুরকিউইজ

4
এই উত্তরের লিঙ্কটি এখন আর সঠিক নয়; দেখতে নিচের user2418306 এর উত্তর বসন্ত ডকুমেন্টেশন থেকে সঠিক লিঙ্ক এবং আরো কনটেক্সট জন্য।
ডেভিড্যাভ ডেভ

4
আমি কাজ করি না, প্রতিটি পদ্ধতিতে পৃথক লেনদেনের প্রয়োজন হয় না, পুরো ক্লাসের জন্য এটি করা যায় না
কামিল নেকানোভিজ

আমি একটি টেবিলের মধ্যে একটি সন্নিবেশ পরীক্ষা করছি। @ ট্রান্সজেকশনাল সহ, সন্নিবেশ কমান্ড এমনকি ডেটাবেসগুলির বিরুদ্ধে জারি করা হয় না (আমি দেখতে পাচ্ছি কারণ কনসোলটি হাইবারনেট শো-এসকিএল সত্য)। অনেক ক্ষেত্রে জরিমানা কাজ করে। তবে আমার পরীক্ষাগুলির মধ্যে একটি পরীক্ষা করে যে ডেটাবেস কোনও ডাটাবেস সীমাবদ্ধতার কারণে ডেটাঅ্যাক্সেসএক্সসেপশন জারি করে। এই ক্ষেত্রে পরীক্ষা ব্যর্থ হয় কারণ রোলব্যাকটি "স্মৃতিতে" ঘটে এবং ডাটাবেসটি কখনই ডাকা হয় না। সমাধান: ব্যবহার @Transactional@Testপদ্ধতি স্তর এবং ক্লাসে স্তরে।
পাওলো মেরসন

17

পাশে: টমাসজ নুরকিউইকের উত্তর সংশোধন করার প্রচেষ্টা প্রত্যাখ্যান করা হয়েছিল:

এই সম্পাদনাটি পোস্টটি পড়ার সামান্য কিছুটা সহজ, সন্ধানে সহজ, আরও নির্ভুল বা আরও অ্যাক্সেসযোগ্য করে তোলে না। পরিবর্তনগুলি হয় সম্পূর্ণরূপে অতিরিক্ত প্রয়োজন বা সক্রিয়ভাবে পাঠযোগ্যতার ক্ষতি করে।


সংহতকরণ পরীক্ষা সম্পর্কে ডকুমেন্টেশনের সম্পর্কিত বিভাগে সঠিক এবং স্থায়ী লিঙ্ক

লেনদেনের জন্য সমর্থন সক্ষম করতে, আপনাকে শব্দার্থের মাধ্যমে লোড করা একটি PlatformTransactionManagerশিমটি কনফিগার করতে হবে ।ApplicationContext@ContextConfiguration

@কনফিগারেশন
@ প্রপার্টিসোর্স ("application.properties")
পাবলিক ক্লাস অধ্যবসায় {
    @ স্বীকৃত
    পরিবেশ env;

    @ বিয়ান
    ডেটাসোর্স ডেটাসোর্স () {
        নতুন ড্রাইভার-ম্যানেজার ডেটাসোর্স ফিরিয়ে দিন (
                env.getProperty ("datasource.url"),
                env.getProperty ("datasource.user"),
                env.getProperty ("ডেটাসোর্স.প্যাসওয়ার্ড")
        );
    }

    @ বিয়ান
    প্ল্যাটফর্ম ট্রান্সজেকশন ম্যানেজার লেনদেন ম্যানেজার () {
        নতুন ডেটাসোর্স ট্রান্সজেকশন ম্যানেজার (ডেটাসোর্স ()) প্রদান করুন;
    }
}

এছাড়াও, @Transactionalআপনার পরীক্ষার জন্য আপনার অবশ্যই ক্লাসে বা পদ্ধতি পর্যায়ে স্প্রিংয়ের টীকাটি ঘোষণা করতে হবে ।

@ রুনউইথ (স্প্রিংজউনিট ৪ ক্লাসরানার.ক্লাস)
টুইটারে
@ লেনদেন
পাবলিক ক্লাস সোমাররোপোসিটারি টেস্ট {...}

একটি পরীক্ষা পদ্ধতিতে টীকাগুলি টিকিয়ে রাখার @Transactionalফলে পরীক্ষাটি একটি লেনদেনের মধ্যে পরিচালিত হয় যা ডিফল্টরূপে, পরীক্ষা শেষ হওয়ার পরে স্বয়ংক্রিয়ভাবে ঘূর্ণিত হয়। যদি কোনও পরীক্ষার শ্রেণি দিয়ে টীকায়িত হয় @Transactional, তবে শ্রেণি শ্রেণিবদ্ধের মধ্যে প্রতিটি পরীক্ষার পদ্ধতি লেনদেনের মধ্যেই চালানো হবে।


12

যুক্ত করা উত্তরগুলি @Transactionalসঠিক, তবে সরলতার জন্য আপনার পরীক্ষার শ্রেণিটি থাকতে পারে extends AbstractTransactionalJUnit4SpringContextTests


4
ক্লাস পর্যায়ে '@ ট্রানজেকশনাল' যোগ করা কাজ করে না, প্রতিটি ফাংশনটির জন্য আলাদাভাবে টিকা '@ ট্রান্সএশনাল' যুক্ত করে, এবং অ্যাবস্ট্রাক্ট
ট্রান্সজেকশনাল JUnit4SpringContext টেস্টগুলিও

5

আমি জানি, আমি একটি উত্তর পোস্ট করতে দেরি হয়ে গেছে, তবে আশা করি এটি কারওর পক্ষে সহায়তা করতে পারে। এছাড়াও, আমি আমার পরীক্ষাগুলি দিয়ে এই সমস্যার সমাধান করেছি। আমার পরীক্ষায় এটিই ছিল:

আমার পরীক্ষার ক্লাস

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "path-to-context" })
@Transactional
public class MyIntegrationTest 

প্রসঙ্গ xML

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
   <property name="driverClassName" value="${jdbc.driverClassName}" />
   <property name="url" value="${jdbc.url}" />
   <property name="username" value="${jdbc.username}" />
   <property name="password" value="${jdbc.password}" />
</bean>

আমার তখনও সমস্যা ছিল যে, ডাটাবেসটি স্বয়ংক্রিয়ভাবে পরিষ্কার হচ্ছে না।

আমি বেসিকটাটাসোর্সটিতে নিম্নলিখিত সম্পত্তি যুক্ত করার পরে সমস্যার সমাধান হয়েছিল

<property name="defaultAutoCommit" value="false" />

আশা করি এটা সাহায্য করবে.


ঠিক আছে, সুতরাং আপনি নিজের বিবৃতি ম্যানুয়ালি কমিট করেন? আপনি কি নিশ্চিত যে আপনার ডেটাবেজে এমনকি আপনার ডেটা লেখা হয়েছিল?
ফ্রেঁটা কোচরেক

যে কেউ স্প্রিং লেনদেন বোঝার জন্য লড়াই করছেন, নিশ্চিত করুন যে আপনার ডেটা উত্সটি স্বয়ংক্রিয়ভাবে প্রতিশ্রুতিবদ্ধ না হয়ে আছে বা আপনি কেন @ ট্রানজেকশনাল কিছুই করেনি বলে মনে করার চেষ্টা করে নিজেকে উন্মাদ করবেন।
জো আর্নেস্ট

2

আপনার একটি বসন্ত প্রসঙ্গে এবং একটি লেনদেন পরিচালকের মাধ্যমে আপনার পরীক্ষা চালানো দরকার, যেমন,

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = {"/your-applicationContext.xml"})
@TransactionConfiguration(transactionManager="txMgr")
public class StudentSystemTest {

     @Test
     public void testTransactionalService() {
         // test transactional service
     }

     @Test
     @Transactional
     public void testNonTransactionalService() {
         // test non-transactional service
     }
}

3.5.8. Transaction Managementআরও তথ্যের জন্য বসন্তের রেফারেন্সের অধ্যায়টি দেখুন ।



-5

আপনি রোলব্যাকটি অক্ষম করতে পারেন:

@TransactionConfiguration(defaultRollback = false)

উদাহরণ:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@Transactional
@TransactionConfiguration(defaultRollback = false)
public class Test {
    @PersistenceContext
    private EntityManager em;

    @org.junit.Test
    public void menge() {
        PersistentObject object = new PersistentObject();
        em.persist(object);
        em.flush();
    }
}

6
ওপি যা চেয়েছে তার ঠিক বিপরীতে
আদম মিশালিক

এটি গ্রহণযোগ্য উত্তরের একটি মন্তব্য হওয়া উচিত ছিল।
ডেরমাইক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.